适用场景

MQ 堆积不可怕,可怕的是不知道为什么堆。堆积原因通常分四类:消费端处理慢、消费者数量不足、分区数不够、下游依赖超时。定位清楚再动作,否则加消费者可能带来乱序与重复消费。

配置步骤(堆积定位与应急处置)

# 1) Kafka:查看消费组堆积
kafka-consumer-groups.sh --bootstrap-server broker1:9092 --describe --group order-consumer
# 关注:CURRENT-OFFSET、LOG-END-OFFSET、LAG

# 2) 分区与消费线程匹配度
# 消费线程数 <= 分区数,否则多余线程空转

# 3) 消费耗时定位
# 在消费日志中统计单条处理耗时分布(P50/P95/P99)

# 4) 下游依赖耗时
# 检查消费逻辑中调用数据库/接口的耗时,超时配置是否合理

# 5) 应急
#   - 先扩消费者(分区数足够时)
#   - 必要时临时降级非关键处理逻辑

关键参数与建议

  • 先量化:堆积量与增长速率,判断是突发还是持续
  • 分类定位:消费耗时、消费线程数、分区数、下游依赖耗时四查
  • 应急手段:扩消费者、扩分区、临时跳过非关键消息(需评估)
  • 顺序要求:需保序的业务不能随意扩分区,要先确认分区键
  • 幂等保障:扩消费者与重试会增加重复消费,消费端必须幂等
  • 下游保护:消费端要有限流与超时,避免压垮数据库
  • 长期治理:容量基线、堆积告警、定时任务与业务高峰错峰

容易踩的坑

  • 只看堆积数不看增长速率,误判为突发
  • 分区数不足,加消费者也无效
  • 扩消费者没考虑顺序要求,业务出现乱序
  • 消费端不幂等,重试后重复扣款
  • 无超时设置,一条慢消息卡住整个分区
  • 应急跳过消息没记录,数据丢失无从追溯

验证与巡检

# 堆积趋势采样(每 10 秒)
for i in 1 2 3 4 5 6; do
  kafka-consumer-groups.sh --bootstrap-server broker1:9092 --describe --group order-consumer | awk 'NR>1{s+=$6} END{print strftime("%H:%M:%S"), "lag=", s}'
  sleep 10
done

# 消费速率与生产速率对比,判断何时能追上
  • 巡检:LAG 趋势下降至 0、无分区偏移异常、消费耗时 P99 达标

小结

MQ 治理验收:堆积能在告警后 30 分钟内说清原因并给出处置,消费端支持幂等与限流,堆积不再靠人工盯着。

> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。