MQ 消息堆积排查
先判断是生产突增还是消费变慢,再定位慢点并限速回放。
面试官问题
线上 MQ 突然堆积了几百万条消息,Lag 持续上涨,你怎么判断原因、怎么快速恢复,又怎么避免把下游打崩?
考生产/消费速率判断、Consumer 慢点定位、下游依赖排查、扩容边界、限速回放与告警指标。
先用指标判断入口:生产 QPS 突增还是消费 QPS 下降。消费慢再拆 Consumer CPU、线程池、DB 慢 SQL、下游限流。恢复时扩容或优化慢点,但回放积压要限速,避免冲垮下游。
业务背景
营销活动、下游故障或慢 SQL 都可能让消费速率低于生产速率,消息在 Broker 中堆积并拉高业务延迟。
- Lag 上涨时第一步看什么指标?
- Consumer 扩容为什么可能无效?
- 积压消息如何限速回放?
关键约束
- 先定位原因,再决定扩容还是优化。
- 恢复积压不能制造二次洪峰。
- 顺序消费存在并发上限。
- 毒消息要隔离,不能堵住主队列。
系统建模
- 1
Producer 流量管道:显示生产速率。
- 2
Consumer 工人:显示处理能力和慢点。
- 3
Backlog 水位:显示积压总量。
- 4
Lag 曲线:显示消费落后时间。
- 5
告警面板:提示 CPU、慢 SQL、下游限流。
- 6
扩容按钮:模拟增加 Consumer 或优化慢点。
动画推演
看 Producer 管道变粗、Consumer 工人处理不过来时 Backlog 水位和 Lag 曲线如何上涨;点击扩容或优化慢 SQL 后指标如何恢复。
- 01 Producer QPS 突增。
- 02 Consumer QPS 跟不上。
- 03 Lag / Backlog 增长。
- 04 判断是生产突增还是消费变慢。
- 05 检查 Consumer CPU、DB 慢 SQL、下游限流。
- 06 扩容 Consumer 或优化慢点。
- 07 限速回放积压消息。
观察 Producer、Consumer、Backlog、Lag 和告警面板如何共同定位瓶颈。
4 实例
故障注入 / 错误做法
直接多加几台 Consumer,把消息赶紧消费完;如果还不行就清掉队列重新来。
先用指标判断入口:生产 QPS 突增还是消费 QPS 下降。消费慢再拆 Consumer CPU、线程池、DB 慢 SQL、下游限流。恢复时扩容或优化慢点,但回放积压要限速,避免冲垮下游。
错误做法是只加 Consumer。动画会注入 DB 慢 SQL 和下游限流,展示盲目扩容如何把下游错误率推高。
- 盲目扩容会把 DB 或下游接口打崩。
- 顺序消费受队列数限制,加机器不一定提速。
- 毒消息反复重试会堵住队列。
- 积压回放太快会造成二次峰值。
30 秒面试表达
- 01
我先看三组指标:Producer QPS、Consumer QPS 和 Lag/Backlog 曲线,判断是生产突然变大还是消费突然变慢。
- 02
如果是消费慢,再看 Consumer CPU、线程池、DB 慢 SQL、下游限流和错误重试,定位是哪一段拖慢。
- 03
恢复手段不是盲目加机器:能扩容就扩 Consumer,但顺序消费要确认队列数;慢 SQL 或下游限流要先优化或隔离。
- 04
处理积压时要限速回放,让 Lag 逐步下降,避免把数据库和下游服务再次打爆。
常见追问
怎么判断生产突增还是消费变慢?▶
看 Producer QPS 和 Consumer QPS 的相对变化。生产升高但消费稳定,是流量突增;生产没变但消费下降,是消费者或下游变慢。
扩 Consumer 为什么有时没用?▶
顺序消费或分区队列有并发上限,队列数就是上限。Consumer 数超过队列数后不会提高吞吐。
一条消息一直失败怎么办?▶
设置最大重试次数,超过后进死信队列,主队列继续向后消费。死信再人工或补偿处理。
复盘卡片
- 先判生产突增还是消费变慢。
- 扩容要看队列数、下游容量和错误率。
- 回放积压要限速,恢复曲线比清空速度更重要。