无名小厂,流程不规范,一般都是自己 own 一个项目,开发&上下线,QA 参与度不高。
-
跟他共事快 2 年,他离职后交接了 2 个项目给我,另 1 个项目给其他人
-
他交接给我的一个项目,是给其他团队输出数据的接口,对面的人大概每隔 1 、2 周来找我说没数据了,我不知道他在的时候是怎么维护的,这个项目在我这里不算重要而且事情也确实太多没精力细察,每次来找就重启一下。后来干脆搞了个定时重启,再没来找过了。
-
另一个项目是 toc 的,有一天突然没数据了。后来经过一番检查,发现他在项目里面有一些这样的设计和实现:
- 限制全局的 goroutine 数量,超出某个值后不再接收数据而是返回 500 。这个阈值我猜测是拍脑袋想的
- 在处理请求的函数内,用 1 个异步函数处理数据,函数内先做加锁,然后再起个 goroutine 负责超时/处理完成后解锁操作,类似于
var lk sync.Mutex done := make(chan struct{}) go func() { lk.Lock() go func() { select { case <-time.After(3 * time.Second): case <-done: } lk.Unlock() }() // 处理数据 done <- struct{}{} }()一旦处理数据超时,就 hang 在发送 done 信号那里,导致 goroutine 数量缓慢增加,直到触发他设定的阈值。更绝的是这个问题短期内不会暴露,压测的时候资源给的也很足,没有发现。实际上线的时候,长时间运行下来导致这个问题最终暴露,拉长监控面板一看内存占用真是稳步线性增长。
-
近日又发现项目依赖的 db 总是高水位报警,昨天链接上去看了下,发现所有的表没有索引,而程序需要定时对表进行 select 、insert 、update 等操作。拉长面板到 90 天范围一看,占用率也是缓慢线性升高
如何评价?别有用心还是真的就这水平。我估摸着让我来写,大概率是写不出这个不定时炸弹的。