【发布时间】:2017-03-02 22:08:15
【问题描述】:
组心跳失败的确切原因是什么,因为它正在重新平衡?在组中所有消费者都起来的情况下重新平衡的原因是什么?
谢谢。
【问题讨论】:
标签: apache-kafka kafka-producer-api
组心跳失败的确切原因是什么,因为它正在重新平衡?在组中所有消费者都起来的情况下重新平衡的原因是什么?
谢谢。
【问题讨论】:
标签: apache-kafka kafka-producer-api
检测信号是检查所有消费者是否仍在运行的基本机制。如果由于组正在重新平衡而导致心跳失败,则表明您的消费者实例发送下一个心跳的时间过长并且被认为已死,因此触发了重新平衡。
如果您想防止这种情况发生,您可以增加超时时间 (session.timeout.ms),或者确保您的消费者更频繁地发送心跳 (heartbeat.interval.ms)。心跳基本上嵌入在poll() 中,因此,您需要确保足够频繁地调用 poll。这通常可以通过限制单个轮询通过max.poll.records 返回的记录数来实现(以缩短处理所有获取的数据所需的时间)。
更新
从 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.ms 和heartbeat.interval.ms 仍然相同。此外,max.poll.interval.ms 决定了必须调用poll() 的频率。如果你在max.poll.interval.ms中错过了调用poll(),心跳线程会假设处理线程死亡,并会发送一个离开组的请求,触发重新平衡,之后心跳线程将停止发送心跳。如果你处理线程没问题但速度很慢,下一次调用poll() 将启动另一个重新平衡以再次重新加入组。
有关更多详细信息,请参阅。 Difference between session.timeout.ms and max.poll.interval.ms for Kafka >= 0.10.1
【讨论】: