给大家乐呵一下

2024-05-07 11:39:48 +08:00
 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 天范围一看,占用率也是缓慢线性升高

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

5758 次点击
所在节点    程序员
37 条回复
0Z03ry75kWg9m0XS
2024-05-07 14:58:30 +08:00
挺好的,学到了
hellomsg
2024-05-07 15:27:18 +08:00
我要是你,我就默默的改 bug 了
TrigVon
2024-05-07 15:32:40 +08:00
挺好的,学到了
forbreak
2024-05-07 16:05:23 +08:00
挺好的,学到了。 系统不定时出问题,老板会感觉不到你存在的价值。
zylll520
2024-05-07 16:06:57 +08:00
这种操作真的是学到了!!!
lambdaq
2024-05-07 16:09:28 +08:00
这不是防御性编程啊。是面向岗位安全编程。
zackzergzeng
2024-05-07 16:27:58 +08:00
学到了,最好藏的问题就是性能问题🤪
ahaooahaz
2024-05-07 16:31:04 +08:00
@R18 要是 done 有缓冲区也会产生这个 bug ,这个没太理解,有缓冲区不是就不会阻塞了吗
R18
2024-05-07 16:33:32 +08:00
@ahaooahaz 但是缓冲区也有满的时候啊,满了还是会阻塞。他这个相当于只要超时一次,就会有一个写入无法消耗。
jerry0531
2024-05-07 16:36:37 +08:00
挺好的 学到了
xxxccc
2024-05-07 16:38:10 +08:00
@jjtang11 理论上 它直接 close 那个 channel 就行了
NoOneNoBody
2024-05-07 16:43:43 +08:00
评价是:你知道他为什么走的,但不知道他是怎么来的
z1154505909
2024-05-07 17:08:09 +08:00
学习了,以后可以借鉴一下
darksword21
2024-05-07 18:31:23 +08:00
这操作真的无敌
zong400
2024-05-08 08:41:34 +08:00
这个是不是也能理解成,一个耗时操作只等 3s ,处理不完也不阻塞下一个,哈哈
guanzhangzhang
2024-05-10 12:53:49 +08:00
要是我就直接改了,这种开发真让同事和运维心累
Xinu
2024-05-15 09:47:11 +08:00
这个 bug 我写过,场景都类似,超时以后忘记回收协程了

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

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

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

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

© 2021 V2EX