话题动态
发起者
阿蒙
话题状态
等待首个回复
参与人
1
互动热度
0
聊聊 golang.org/x/sync/singleflight 防击穿踩过的坑。
单看效果确实神,本地跑了个压测,10000 并发压同一个热 Key,打到后端 DB 的请求直接从 10k 压到 1 个,CPU 占用直接砍了 80%。
但实际线上跑,踩了两个大雷:
Do 返回的是 interface{},有人顺手返回了指针对象,结果调用方并发读写同一个结构体,直接触发 race。为了安全加了一层深拷贝,跑 Benchmark 发现深拷贝结构体直接从 45 ns/op 飙到 1200 ns/op,高并发下 GC 压力翻倍。DoChan + select ctx.Done(),但这样如果 Context 提前 cancel,后台那个 Goroutine 还是在跑,没法真正中断下游。大家现在防击穿是给 singleflight 套深拷贝 / 序列化,还是只放基本类型 / 传不可变数据?针对慢请求拖累全车人,你们是用 DoChan 降级还是加了熔断限制?
全部回复(0)