订单消费组每隔十分钟收到一次 rebalance,日志里是 Attempt to heartbeat failed since group is rebalancing。一次 poll 拉 500 条,逐条调风控接口,处理完要八分钟。日志里能对上时间点,这种反而好排。
max.poll.interval.ms 默认 300000,两次 poll 之间超过这个时间,协调者认为消费者已经不干活,把它踢出组后触发重平衡。处理逻辑放在 poll 循环里同步跑,批越大间隔越长。这一点先确认清楚,后面就不用反复试。
# consumer.properties max.poll.records=100 max.poll.interval.ms=900000 kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 \ --describe --group order-consumer
围绕「Kafka max.poll.interval」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。
处理上按这个顺序:把 max.poll.records 从 500 降到 100 缩短单批耗时;业务处理挪到独立线程池 poll 只负责拉取和提交;确实要长事务就同步调大 max.poll.interval.ms 到 900000;改完确认 rebalance 日志不再出现。
结果对不对很好判断,连续跑两小时日志里没有 rebalancing 提示 每个分区 lag 稳定下降。
