Yihui’s Blog

MQ消息积压了怎么办

日期:2026-09-27
标签:#面试 #场景设计 #消息队列 #Kafka
难度:中等
来源:牛面场景题
答案说明:独立整理(站内题目标记为 VIP,未读取会员答案)

一句话答案

先用流入/处理速率、分区延迟、最老消息年龄和错误率判断积压原因,再止血、修复瓶颈、按容量清理,并核对保留期和业务时效。

面试口语版(约 75 秒)

我会先确认是不是持续积压:看生产与消费速率、各分区 lag、最老未处理消息年龄、错误率、重试和 rebalance,以及 Broker 磁盘和保留期。若是下游数据库变慢或接口限流,先止血,限制入口、修复慢查询或隔离故障任务;盲目加消费者只会继续压垮下游。若消费程序正常且分区足够、下游有余量,再加消费者实例或批处理能力。单个热分区造成积压时,多加同组消费者通常无效,要看键分布和顺序要求。最后按净处理速率估算清空时间,跟踪最老消息年龄;超期消息要按业务规则补偿或审计,不能直接改位点丢弃。

排障流程

flowchart TD
  A[发现 lag 或年龄增长] --> B{生产速率 > 消费速率?}
  B -->|是| C[限流或扩真实处理能力]
  B -->|否| D[查消费错误与暂停]
  C --> E{分区偏斜?}
  D --> E
  E -->|是| F[检查热键与顺序约束]
  E -->|否| G[查下游延迟、重试、rebalance]
  F --> H[制定清理与补偿计划]
  G --> H
  H --> I[监控保留期、容量与清空时间]
观察可能原因优先动作
所有分区 lag 都增长消费总能力不足或下游变慢测处理耗时、下游饱和度;入口背压、修复瓶颈
单分区 lag 很高热键或单分区串行处理检查分区键、业务顺序要求,再考虑拆分
lag 波动且反复重平衡处理过慢、poll 间隔或实例不稳定查错误日志、处理时长和消费者配置
一条消息不断失败坏消息、外部依赖故障有界重试、隔离处理、保留审计与补偿
lag 尚可但最老消息很旧局部停滞或位点指标失真分区级排查和端到端时间戳核对

清积压计算与失败分支

设待处理积压 B 条,后续平均新增 A 条/秒,稳定消费能力 C 条/秒。只有 C > A 才能清空,粗略耗时 B ÷ (C − A)。例如积压 100 万条、正常流入 200 条/秒、真实可持续消费 700 条/秒,理论约 2,000 秒;若下游只能承受 400 条/秒,强行把消费者扩到 700 条/秒会让错误率和重试上升,实际 C 反而下降。估算还应计入消息大小、失败重试和分区不均。

取舍与易错点

  • 同一消费者组的单个分区同一时刻只分给一个成员;实例数超过分区数不会提高该组的分区级并行度。
  • 扩分区可能改变键到分区的映射,影响同键顺序;先验证业务顺序与旧消息处理策略。
  • Kafka 的 consumer lag 是位点距离,不直接等于等待时间;单独监控最老待处理消息年龄及业务完成延迟。
  • 不要直接跳到最新位点、无限延长保留期或无限重试。若确需丢弃过期任务,应有明确业务授权、记录和补偿。
  • 处理速度必须以业务副作用成功为准,不能用“拉取很快”掩盖未完成或提前提交位点。

面试官递进追问

  1. 先看哪些指标? 生产/消费速率、分区 lag、最老消息年龄、错误/重试、Broker 与下游资源。
  2. 为什么加消费者仍没效果? 分区数或热分区限制并行,也可能被数据库等下游限制。
  3. 如何安全清理或跳过过期消息? 按业务时效定义、审计、补偿与对账,避免直接丢弃关键事件。

自测

  • 给定 B、A、C,算清空时间,并说明 C ≤ A 时发生什么。
  • 画出“单热分区”和“所有分区都慢”的不同排障路线。
  • 写出积压预警条件:增长速度、最老消息年龄、距保留期余量与业务失败率。

参考资料

核对日期:2026-09-27。

维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

如何为Redis分布式锁设置合理的超时时间?

日期:2026-09-27 标签:#面试 #场景设计 #Redis 难度:中等 来源:牛面场景题 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 租约应覆盖可预期的执行、暂停与网络抖动,同时限制故障后的等待;没有可靠耗时上界时用有身份校验的受控续期,并在业务资源侧防止旧执行者写入。 面试…

阅读全文

怎么用Redis实现可重入的分布式锁?

日期:2026-09-27 标签:#面试 #场景设计 #Redis 难度:中等 来源:牛面场景题 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 为同一把锁保存“本次最外层获锁的唯一令牌 + 重入次数 + 租约”;嵌套调用共享该令牌并原子递增,释放时递减,次数归零才删除。新一轮独立获锁必…

阅读全文

基于 Redis 实现分布式锁有什么优缺点?

日期:2026-09-27 标签:#面试 #场景设计 #Redis 难度:简单 来源:牛面场景题 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 Redis 锁接入简单、响应快,适合容忍少量故障窗口内重复执行的任务;租约过期与主从切换可能破坏互斥,关键写入还须在资源侧拒绝旧持有者。 面试…

阅读全文