外观
Kafka 积压怎么排查
难度与前置
难度:中级
前置:知道消费组与 lag;能跑 kafka-consumer-groups 或看等价监控面板。
读完能做什么:用分区级 lag 定位环节,按分支处理,并用「速率/水位」前后数字验收。
适用场景
- 某消费组 lag 持续上涨,下游实时任务延迟
- 夜间活动后 lag 尖峰,白天消不下去
不适用:
- 偶发几秒抖动且自动消化
- 还没确认看的是正确的 group / topic(先核对订阅配置)
真实场景(一条)
投放点击 Topic 夜间 lag 从约 2 万涨到约 1200 万,实时消耗看板延迟约 15 分钟。
排查:
- 分区级 lag:64 分区里 1 个分区占了约 70% 积压(热点 key)
- 消费端逐条同步写库,单条 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 invs 消费组消费速率 - 若生产 ≫ 消费且持续 → 能力问题或下游堵
- 若生产正常、消费骤降 → 查消费者挂掉、重平衡、下游反压(联查 Flink 反压)
3. 分支决策树
| 现象 | 下一步 |
|---|---|
| 单分区 lag 远高于其他 | 热点键 / 分区策略;打散或拆 Topic |
| 所有分区 lag 齐涨、消费速率上不去 | 扩消费者(≤ 分区数)、批处理、查下游写 |
CONSUMER-ID 空白或频繁变化 | 重平衡:会话超时、单条过久、频繁发布 |
| 生产突增且业务预期内 | 临时扩容 + 接受追平窗口;设水位告警 |
4. 处理动作(一次一类)
- 消费者数 ≤ 分区数;需要更高并行时有规划地加分区(加分区不自动迁移旧消息)
- 消费逻辑改为 poll 批量 → 批量写下游,避免 per-message RPC
- 热点:业务键加盐、或独立 Topic 给头部渠道
- 下游是 Flink:同时看 source lag 与算子反压,避免只扩 Kafka 消费者
示意(消费侧批量,语言无关):
text
poll(max_records=500) → buffer
buffer 满或超时 → flush 下游(批量 INSERT / 批量 HTTP)
提交 offset(按你们的 at-least-once / exactly-once 约定)5. 与实时链路联查
端到端仍慢时,按 实时链路延迟排查 分段,不要假设「lag 降了看板一定快」。
常见坑(至少这些)
消费者数 > 分区数
多出来的实例空转,总吞吐上不去。随意
seek to end/ 重置到最新
lag「秒清」,业务数据空洞。重置前备份 offset,并书面确认可丢范围。只看总 lag
一个热点分区 + 其余为 0,平均值很好看,延迟已经炸了。重平衡风暴当偶发延迟
处理时间 >max.poll.interval,成员不断被踢;日志里反复Revoking/Assigned。加分区当银弹
旧消息仍在旧分区;热点键哈希不变则新分区也救不了该键。消费变快但下游写库被打满
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
改写说明:审校通过后的补厚定稿;无未公开集群地址与公司数据。