给大家乐呵一下

241 天前
 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 天范围一看,占用率也是缓慢线性升高

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

5343 次点击
所在节点    程序员
37 条回复
0Z03ry75kWg9m0XS
241 天前
挺好的,学到了
hellomsg
241 天前
我要是你,我就默默的改 bug 了
TrigVon
241 天前
挺好的,学到了
forbreak
241 天前
挺好的,学到了。 系统不定时出问题,老板会感觉不到你存在的价值。
zylll520
241 天前
这种操作真的是学到了!!!
lambdaq
241 天前
这不是防御性编程啊。是面向岗位安全编程。
zackzergzeng
241 天前
学到了,最好藏的问题就是性能问题🤪
ahaooahaz
241 天前
@R18 要是 done 有缓冲区也会产生这个 bug ,这个没太理解,有缓冲区不是就不会阻塞了吗
R18
241 天前
@ahaooahaz 但是缓冲区也有满的时候啊,满了还是会阻塞。他这个相当于只要超时一次,就会有一个写入无法消耗。
jerry0531
241 天前
挺好的 学到了
xxxccc
241 天前
@jjtang11 理论上 它直接 close 那个 channel 就行了
NoOneNoBody
241 天前
评价是:你知道他为什么走的,但不知道他是怎么来的
z1154505909
241 天前
学习了,以后可以借鉴一下
darksword21
241 天前
这操作真的无敌
zong400
240 天前
这个是不是也能理解成,一个耗时操作只等 3s ,处理不完也不阻塞下一个,哈哈
guanzhangzhang
238 天前
要是我就直接改了,这种开发真让同事和运维心累
Xinu
233 天前
这个 bug 我写过,场景都类似,超时以后忘记回收协程了

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

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

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

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

© 2021 V2EX