先看现象。Kafka 消费组积压到五十万,运维把消费者从四台扩到十二台,lag 不降反升,日志里每分钟都有 Preparing to rebalance group,下游写入也跟着抖。

排查方向其实有限,先把可能性排一排。消费者频繁上下线,每次都触发全组重平衡。另一种情况是单批处理时间超过最大拉取间隔被踢出组。

不容易想到的是,分区数少于消费者数,多余实例全程空转。

还有一种情况,会话超时设得太短,网络抖一下就重平衡。

动手时先统计重平衡次数与触发原因

kafka-consumer-groups.sh --bootstrap-server 10.0.0.31:9092 --describe --group order-cg

随后核对会话与拉取间隔参数

grep -E 'session.timeout|max.poll' /opt/app/consumer.properties

再往下用静态成员避免扩容触发全组重平衡

grep -n 'group.instance.id' /opt/app/consumer.properties

剩下的就是按分区数确定消费者上限

kafka-topics.sh --bootstrap-server 10.0.0.31:9092 --describe --topic order-event | head -3

怎么算真的好了,看的是同一批现象。扩容后重平衡降到每小时一次以内,lag 开始稳定下降,各消费者分到的分区数量均匀。

消费者数量不要超过分区数,扩之前先看分区;单条处理时间长就把拉取条数调小,避免被判定失联踢出组。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189