无名小厂,流程不规范,一般都是自己 own 一个项目,开发&上下线,QA 参与度不高。
跟他共事快 2 年,他离职后交接了 2 个项目给我,另 1 个项目给其他人
他交接给我的一个项目,是给其他团队输出数据的接口,对面的人大概每隔 1 、2 周来找我说没数据了,我不知道他在的时候是怎么维护的,这个项目在我这里不算重要而且事情也确实太多没精力细察,每次来找就重启一下。后来干脆搞了个定时重启,再没来找过了。
另一个项目是 toc 的,有一天突然没数据了。后来经过一番检查,发现他在项目里面有一些这样的设计和实现:
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 天范围一看,占用率也是缓慢线性升高
如何评价?别有用心还是真的就这水平。我估摸着让我来写,大概率是写不出这个不定时炸弹的。
1
pota 210 天前
应该就是用心写了 bug
|
2
zhtyytg 210 天前 4
你开头也说了,无名小厂,招的无名打工人,水平参差不齐正常的
|
3
wxw752 210 天前
很正常,去年裁员接的烂摊子现在还时不时踩雷呢
|
4
dj721xHiAvbL11n0 210 天前
挺恶心的
|
5
cryboy007 210 天前
学到了
|
6
jjtang11 210 天前
“一旦处理数据超时,就 hang 在发送 done 信号那里”这句我没理解,你的意思是超时后不但要解锁,而且还要退出 goroutine 是吗
|
7
webcape233 210 天前 via iPhone
不是很懂 异步处理里面锁着等待到完成才解锁? 那为什么不同步处理了
|
8
yustation 210 天前
初学者求问,主键本身是索引列吗,如果只有主键有唯一约束,需要显式对主键建立索引吗,主用 pgs
|
10
ktyang 210 天前
学到了
|
11
R18 210 天前
@jjtang11 它的 done 是个无缓冲区的,产生就要消费(当然有缓冲区也会产生这个 bug )。异步里边要是超时代码直接退出,就少了一个消费者,就等于处理数据的那层 goroutine 最后的 `done <- struct{}{}` 会产生阻塞。
|
12
rm0gang0rf 210 天前
挺好的, 学到了
|
13
tlxma 210 天前
挺好的, 学到了
|
14
blessingcr 210 天前
挺好的, 学到了
|
15
huangyua 210 天前
挺好的,学到了
|
16
danhahaha 210 天前 5
挺好的,对面人稳定 1-2 周来联络下感情,这边也显示下存在感,现在好了,俩人都可有可无了
|
17
meeop 210 天前 1
这个就是优秀的面相岗位开发的代码了,可以在合法的情况下做到:
1 人在系统没事,且不增加很多维护成本 2 人不在系统就定时失效,甚至爆炸 学习了 |
18
meeop 210 天前
总结一下就是设计一些缓慢进行的内存泄漏和性能劣化,同时设置到达终点就触发的炸弹
平时通过手动或者自动方式定时重启计时,保证系统稳定 如果人突然不在了,就会定时爆炸 同时你还说不了啥,毕竟代码有点性能问题很正常 |
19
Tink 210 天前
应该是水平刚好也就是这样,然后也能过 QA ,就上线了
|
20
poembre 210 天前
防御性编程, 一旦处理数据 超过 3 秒 chan 写不进去数据。 grouting 结束不了一直占着内存。 巧的事这哥们把锁给释放了。 只要内存够用不影响下个用户。 然后就是 静静地等待,下游业务过来请客吃饭。 吃完饭服务重启 接着等下一顿饭 联络感情
|
21
0Z03ry75kWg9m0XS 210 天前
挺好的,学到了
|
22
hellomsg 210 天前
我要是你,我就默默的改 bug 了
|
23
TrigVon 210 天前
挺好的,学到了
|
24
forbreak 210 天前
挺好的,学到了。 系统不定时出问题,老板会感觉不到你存在的价值。
|
25
zylll520 210 天前
这种操作真的是学到了!!!
|
26
lambdaq 210 天前
这不是防御性编程啊。是面向岗位安全编程。
|
27
zackzergzeng 210 天前
学到了,最好藏的问题就是性能问题🤪
|
30
jerry0531 210 天前
挺好的 学到了
|
32
NoOneNoBody 210 天前
评价是:你知道他为什么走的,但不知道他是怎么来的
|
33
z1154505909 210 天前
学习了,以后可以借鉴一下
|
34
darksword21 210 天前
这操作真的无敌
|
35
zong400 209 天前
这个是不是也能理解成,一个耗时操作只等 3s ,处理不完也不阻塞下一个,哈哈
|
36
guanzhangzhang 207 天前
要是我就直接改了,这种开发真让同事和运维心累
|
37
Xinu 202 天前
这个 bug 我写过,场景都类似,超时以后忘记回收协程了
|