D
排查资深30 分钟

MQ 消息堆积排查

先判断是生产突增还是消费变慢,再定位慢点并限速回放。

排查MQ高并发Producer QPSConsumer QPSLagBacklog扩容慢 SQL
Java 场景 PDF Ch41 · MQ 消息堆积排查
所属路线 ·MQ 异步系统
01

面试官问题

真实问法

线上 MQ 突然堆积了几百万条消息,Lag 持续上涨,你怎么判断原因、怎么快速恢复,又怎么避免把下游打崩?

这题考什么

考生产/消费速率判断、Consumer 慢点定位、下游依赖排查、扩容边界、限速回放与告警指标。

正确建模思路

先用指标判断入口:生产 QPS 突增还是消费 QPS 下降。消费慢再拆 Consumer CPU、线程池、DB 慢 SQL、下游限流。恢复时扩容或优化慢点,但回放积压要限速,避免冲垮下游。

02

业务背景

营销活动、下游故障或慢 SQL 都可能让消费速率低于生产速率,消息在 Broker 中堆积并拉高业务延迟。

学完后你能回答
  • Lag 上涨时第一步看什么指标?
  • Consumer 扩容为什么可能无效?
  • 积压消息如何限速回放?
03

关键约束

  • 先定位原因,再决定扩容还是优化。
  • 恢复积压不能制造二次洪峰。
  • 顺序消费存在并发上限。
  • 毒消息要隔离,不能堵住主队列。
04

系统建模

  1. 1

    Producer 流量管道:显示生产速率。

  2. 2

    Consumer 工人:显示处理能力和慢点。

  3. 3

    Backlog 水位:显示积压总量。

  4. 4

    Lag 曲线:显示消费落后时间。

  5. 5

    告警面板:提示 CPU、慢 SQL、下游限流。

  6. 6

    扩容按钮:模拟增加 Consumer 或优化慢点。

05

动画推演

动画看什么

看 Producer 管道变粗、Consumer 工人处理不过来时 Backlog 水位和 Lag 曲线如何上涨;点击扩容或优化慢 SQL 后指标如何恢复。

  1. 01 Producer QPS 突增。
  2. 02 Consumer QPS 跟不上。
  3. 03 Lag / Backlog 增长。
  4. 04 判断是生产突增还是消费变慢。
  5. 05 检查 Consumer CPU、DB 慢 SQL、下游限流。
  6. 06 扩容 Consumer 或优化慢点。
  7. 07 限速回放积压消息。
视觉元素
Producer 流量管道Consumer 工人Backlog 水位Lag 曲线告警面板扩容按钮

观察 Producer、Consumer、Backlog、Lag 和告警面板如何共同定位瓶颈。

MQ 堆积排查实验台
Producer
8000 QPS
Consumer
1000 QPS

4 实例

Backlog
0
Lag
0s
消费跟不上CPU 35%
当前焦点 · Producer
timeline4 events · 4 frames
Producer 流量突增 · 1/4
06

故障注入 / 错误做法

错误回答

直接多加几台 Consumer,把消息赶紧消费完;如果还不行就清掉队列重新来。

正确回答

先用指标判断入口:生产 QPS 突增还是消费 QPS 下降。消费慢再拆 Consumer CPU、线程池、DB 慢 SQL、下游限流。恢复时扩容或优化慢点,但回放积压要限速,避免冲垮下游。

故障注入

错误做法是只加 Consumer。动画会注入 DB 慢 SQL 和下游限流,展示盲目扩容如何把下游错误率推高。

风险点
  • 盲目扩容会把 DB 或下游接口打崩。
  • 顺序消费受队列数限制,加机器不一定提速。
  • 毒消息反复重试会堵住队列。
  • 积压回放太快会造成二次峰值。
07

30 秒面试表达

  1. 01

    我先看三组指标:Producer QPS、Consumer QPS 和 Lag/Backlog 曲线,判断是生产突然变大还是消费突然变慢。

  2. 02

    如果是消费慢,再看 Consumer CPU、线程池、DB 慢 SQL、下游限流和错误重试,定位是哪一段拖慢。

  3. 03

    恢复手段不是盲目加机器:能扩容就扩 Consumer,但顺序消费要确认队列数;慢 SQL 或下游限流要先优化或隔离。

  4. 04

    处理积压时要限速回放,让 Lag 逐步下降,避免把数据库和下游服务再次打爆。

08

常见追问

怎么判断生产突增还是消费变慢?

看 Producer QPS 和 Consumer QPS 的相对变化。生产升高但消费稳定,是流量突增;生产没变但消费下降,是消费者或下游变慢。

扩 Consumer 为什么有时没用?

顺序消费或分区队列有并发上限,队列数就是上限。Consumer 数超过队列数后不会提高吞吐。

一条消息一直失败怎么办?

设置最大重试次数,超过后进死信队列,主队列继续向后消费。死信再人工或补偿处理。

09

复盘卡片

  • 先判生产突增还是消费变慢。
  • 扩容要看队列数、下游容量和错误率。
  • 回放积压要限速,恢复曲线比清空速度更重要。