给大家乐呵一下

26 天前
 lwldcr

无名小厂,流程不规范,一般都是自己 own 一个项目,开发&上下线,QA 参与度不高。

  1. 跟他共事快 2 年,他离职后交接了 2 个项目给我,另 1 个项目给其他人

  2. 他交接给我的一个项目,是给其他团队输出数据的接口,对面的人大概每隔 1 、2 周来找我说没数据了,我不知道他在的时候是怎么维护的,这个项目在我这里不算重要而且事情也确实太多没精力细察,每次来找就重启一下。后来干脆搞了个定时重启,再没来找过了。

  3. 另一个项目是 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 数量缓慢增加,直到触发他设定的阈值。更绝的是这个问题短期内不会暴露,压测的时候资源给的也很足,没有发现。实际上线的时候,长时间运行下来导致这个问题最终暴露,拉长监控面板一看内存占用真是稳步线性增长。

  4. 近日又发现项目依赖的 db 总是高水位报警,昨天链接上去看了下,发现所有的表没有索引,而程序需要定时对表进行 select 、insert 、update 等操作。拉长面板到 90 天范围一看,占用率也是缓慢线性升高

如何评价?别有用心还是真的就这水平。我估摸着让我来写,大概率是写不出这个不定时炸弹的。

5019 次点击
所在节点    程序员
37 条回复
pota
26 天前
应该就是用心写了 bug
zhtyytg
26 天前
你开头也说了,无名小厂,招的无名打工人,水平参差不齐正常的
wxw752
26 天前
很正常,去年裁员接的烂摊子现在还时不时踩雷呢
x2420390517
26 天前
挺恶心的
cryboy007
26 天前
学到了
jjtang11
26 天前
“一旦处理数据超时,就 hang 在发送 done 信号那里”这句我没理解,你的意思是超时后不但要解锁,而且还要退出 goroutine 是吗
webcape233
26 天前
不是很懂 异步处理里面锁着等待到完成才解锁? 那为什么不同步处理了
yustation
26 天前
初学者求问,主键本身是索引列吗,如果只有主键有唯一约束,需要显式对主键建立索引吗,主用 pgs
yustation
26 天前
@yustation pgsql - O -
ktyang
26 天前
学到了
R18
26 天前
@jjtang11 它的 done 是个无缓冲区的,产生就要消费(当然有缓冲区也会产生这个 bug )。异步里边要是超时代码直接退出,就少了一个消费者,就等于处理数据的那层 goroutine 最后的 `done <- struct{}{}` 会产生阻塞。
rm0gang0rf
26 天前
挺好的, 学到了
tlxma
26 天前
挺好的, 学到了
blessingcr
26 天前
挺好的, 学到了
huangyua
26 天前
挺好的,学到了
danhahaha
26 天前
挺好的,对面人稳定 1-2 周来联络下感情,这边也显示下存在感,现在好了,俩人都可有可无了
meeop
26 天前
这个就是优秀的面相岗位开发的代码了,可以在合法的情况下做到:
1 人在系统没事,且不增加很多维护成本
2 人不在系统就定时失效,甚至爆炸

学习了
meeop
26 天前
总结一下就是设计一些缓慢进行的内存泄漏和性能劣化,同时设置到达终点就触发的炸弹

平时通过手动或者自动方式定时重启计时,保证系统稳定

如果人突然不在了,就会定时爆炸
同时你还说不了啥,毕竟代码有点性能问题很正常
Tink
26 天前
应该是水平刚好也就是这样,然后也能过 QA ,就上线了
poembre
26 天前
防御性编程, 一旦处理数据 超过 3 秒 chan 写不进去数据。 grouting 结束不了一直占着内存。 巧的事这哥们把锁给释放了。 只要内存够用不影响下个用户。 然后就是 静静地等待,下游业务过来请客吃饭。 吃完饭服务重启 接着等下一顿饭 联络感情

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1038338

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX