组的心跳失败,因为它正在重新平衡

heartbeat failed for group because it's rebalancing

由于正在重新平衡而导致组心跳失败的确切原因是什么?重新平衡组中所有消费者的原因是什么?

谢谢。

心跳是检查所有消费者是否仍在运行和 运行 的基本机制。如果由于组正在重新平衡而导致心跳失败,则表明您的消费者实例发送下一个心跳的时间太长,被认为已死亡,因此触发了重新平衡。

如果您想防止这种情况发生,您可以增加超时 (session.timeout.ms),或者确保您的消费者更频繁地发送心跳 (heartbeat.interval.ms)。心跳基本上嵌入在 poll() 中,因此,您需要确保调用 poll 的频率足够高。这通常可以通过 max.poll.records 限制单个轮询 returns 的记录数来实现(以缩短处理所有获取的数据所需的时间)。

更新

从 Kafka 0.10.1 开始,心跳在后台线程中发送,而不是在调用 poll() 时发送(参见 https://cwiki.apache.org/confluence/display/KAFKA/KIP-62%3A+Allow+consumer+to+send+heartbeats+from+a+background+thread)。在这个新设计中,配置 session.timeout.msheartbeat.interval.ms 仍然相同。此外,还有 max.poll.interval.ms 决定必须调用 poll() 的频率。如果在max.poll.interval.ms内没有调用poll(),heartbeat线程会认为处理线程挂了,会发送leave-group-request触发rebalance,heartbeat线程会停止发送heartbeat然后。如果你的处理线程没问题但只是很慢,下一次调用 poll() 将启动另一个重新平衡以再次重新加入组。

更多详情,请参见。