cat case/PM-2019-0028.md

Discord 2019 服务 flapping 触发 thundering herd 重连,前端队列填满 OOM 级联崩溃

P1 · Discord 实时通信大量用户掉线/无法重连,前端网关队列填满 OOM

summary

2019 年(11 月),Discord 某个后端服务出现 flapping(反复上下线),导致大量已连接客户端被断开。断线客户端随即发起重连,形成 thundering herd(惊群)式的集中重连洪峰;重连请求在会话/网关前端排队,队列被迅速填满并触发前端进程内存耗尽(OOM),进一步加剧不可用,形成级联崩溃,实时通信系统大面积降级。

timeline

服务开始 flapping,客户端批量掉线。短暂后重连洪峰涌向网关,队列积压、前端 OOM,错误率飙升。团队通过扩容前端、限制重连速率与修复 flapping 根因逐步恢复。

root_cause

单点服务不稳定引发大规模掉线,而客户端无退避的重连行为在瞬间形成洪峰,压垮本应承接连接的网关/会话层,OOM 又放大故障。

amplifiers

① 无重连退避:客户端同时重连形成惊群。② 网关缺乏背压:队列无限积压直至 OOM。③ 单点 flapping 放大:一个服务不稳拖垮连接层。④ 容量预留不足:突发重连远超前端处理能力。

mitigation

修复导致 flapping 的根因;对前端扩容并引入重连速率限制与指数退避;增加网关队列背压与 OOM 防护。

lessons

客户端重连必须带随机指数退避;网关需有界队列与背压而非无限积压;对连接层做独立容量与熔断;单点不稳定应有快速隔离。

checklist

① 客户端重连增加随机指数退避。② 网关队列设上限+背压丢弃。③ 前端进程 OOM 防护与自动重启。④ 隔离 flapping 服务防扩散。