Skip to content

Kafka 积压怎么排查 ​

难度与前置

难度:中级
前置:知道消费组与 lag;能跑 kafka-consumer-groups 或看等价监控面板。
读完能做什么:用分区级 lag 定位环节,按分支处理,并用「速率/水位」前后数字验收。

适用场景 ​

  • 某消费组 lag 持续上涨,下游实时任务延迟
  • 夜间活动后 lag 尖峰,白天消不下去

不适用:

  • 偶发几秒抖动且自动消化
  • 还没确认看的是正确的 group / topic(先核对订阅配置)

真实场景(一条) ​

投放点击 Topic 夜间 lag 从约 2 万涨到约 1200 万,实时消耗看板延迟约 15 分钟。

排查:

  1. 分区级 lag:64 分区里 1 个分区占了约 70% 积压(热点 key)
  2. 消费端逐条同步写库,单条 RT 约 20~50ms,吞吐顶在约 2k msg/s,生产峰值约 8k msg/s

处理:批量写(500 条/批)+ 消费者扩到接近分区数 + 热点键加盐。约 3 小时后总 lag 回到 < 5 万水位,看板延迟约 30 秒。

怎么做(步骤清单) ​

1. 拉分区级 lag(可跑) ​

把 <brokers> / <group> 换成你们的值:

bash
kafka-consumer-groups.sh --bootstrap-server <brokers> \
  --describe --group <group>

关注列:TOPIC、PARTITION、CURRENT-OFFSET、LOG-END-OFFSET、LAG、CONSUMER-ID。

记录一版基线(示例表,请填自己的数):

指标改前
总 lag
最大单分区 lag
生产速率(msg/s 或字节/s)
消费速率
端到端延迟

TIP

只看总 lag 会漏掉「一个分区拖死全组」。先按 LAG 降序看 Top 分区。

2. 对照生产 vs 消费速率 ​

  • 监控或 broker/客户端指标:messages in vs 消费组消费速率
  • 若生产 ≫ 消费且持续 → 能力问题或下游堵
  • 若生产正常、消费骤降 → 查消费者挂掉、重平衡、下游反压(联查 Flink 反压)

3. 分支决策树 ​

现象下一步
单分区 lag 远高于其他热点键 / 分区策略;打散或拆 Topic
所有分区 lag 齐涨、消费速率上不去扩消费者(≤ 分区数)、批处理、查下游写
CONSUMER-ID 空白或频繁变化重平衡:会话超时、单条过久、频繁发布
生产突增且业务预期内临时扩容 + 接受追平窗口;设水位告警

4. 处理动作(一次一类) ​

  1. 消费者数 ≤ 分区数;需要更高并行时有规划地加分区(加分区不自动迁移旧消息)
  2. 消费逻辑改为 poll 批量 → 批量写下游,避免 per-message RPC
  3. 热点:业务键加盐、或独立 Topic 给头部渠道
  4. 下游是 Flink:同时看 source lag 与算子反压,避免只扩 Kafka 消费者

示意(消费侧批量,语言无关):

text
poll(max_records=500) → buffer
buffer 满或超时 → flush 下游(批量 INSERT / 批量 HTTP)
提交 offset(按你们的 at-least-once / exactly-once 约定)

5. 与实时链路联查 ​

端到端仍慢时,按 实时链路延迟排查 分段,不要假设「lag 降了看板一定快」。

常见坑(至少这些) ​

  1. 消费者数 > 分区数
    多出来的实例空转,总吞吐上不去。

  2. 随意 seek to end / 重置到最新
    lag「秒清」,业务数据空洞。重置前备份 offset,并书面确认可丢范围。

  3. 只看总 lag
    一个热点分区 + 其余为 0,平均值很好看,延迟已经炸了。

  4. 重平衡风暴当偶发延迟
    处理时间 > max.poll.interval,成员不断被踢;日志里反复 Revoking / Assigned。

  5. 加分区当银弹
    旧消息仍在旧分区;热点键哈希不变则新分区也救不了该键。

  6. 消费变快但下游写库被打满
    lag 降、错误率升;要限流或扩库,而不是只加消费者。

如何验收(带数字的前后对比) ​

合并前填完这张表(数字换成你们实测):

指标改前改后是否达标
总 lag如 1200 万如 < 5 万回约定水位
最大单分区 lag / 总 lag如 70%如 < 20%倾斜缓解
消费速率如 2k msg/s如 ≥ 8k msg/s(追平期)追得上生产
端到端延迟如 15 min如 ≤ 30 s业务 SLA
10 分钟内 rebalance 次数如 > 5如 0~1稳态

Checklist:

  • [ ] kafka-consumer-groups --describe 输出已归档(改前/改后)
  • [ ] 追平期消费速率 ≥ 生产速率;稳态二者接近
  • [ ] 分区 lag 分布无极端单户
  • [ ] 未使用未审批的 reset-to-end
  • [ ] 下游错误率未同步恶化

相关面试题 ​

题库小程序链接待定;先用站内锚点占位。

  • [ ] 题:拿到 consumer-groups describe 后,先看总 lag 还是分区分布?为什么?(考察点:总 lag + 最大单分区占比)→ 占位:#todo-interview-kafka-lag-total-vs-skew
  • [ ] 题:追平期消费速率要满足什么才算追上?(考察点:追平期 ≥ 生产速率)→ 占位:#todo-interview-kafka-lag-catchup-rate
  • [ ] 题:什么情况下禁止未经审批的 reset-to-end?(考察点:未审批 reset 禁令 + 下游错误率未恶化)→ 占位:#todo-interview-kafka-lag-no-reset
  • [ ] 题:如何用数字表验收 lag 治理达标?(考察点:改前改后表:总 lag/倾斜/速率/端到端延迟/rebalance)→ 占位:#todo-interview-kafka-lag-acceptance-table

改写说明:审校通过后的补厚定稿;无未公开集群地址与公司数据。