组的心跳失败,因为它正在重新平衡
Posted
技术标签:
【中文标题】组的心跳失败,因为它正在重新平衡【英文标题】:heartbeat failed for group because it's rebalancing 【发布时间】:2017-03-02 22:08:15 【问题描述】:组心跳失败的确切原因是什么,因为它正在重新平衡?在组中所有消费者都起来的情况下重新平衡的原因是什么?
谢谢。
【问题讨论】:
【参考方案1】:检测信号是检查所有消费者是否仍在运行的基本机制。如果由于组正在重新平衡而导致心跳失败,则表明您的消费者实例发送下一个心跳的时间过长并且被认为已死,因此触发了重新平衡。
如果您想防止这种情况发生,您可以增加超时时间 (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
【讨论】:
你能告诉我在更新的情况下应该怎么做以避免同样的事情吗? 不确定您的意思?也许问一个新问题并更详细地阐述? 你能看看这个吗:***.com/questions/60753274/…以上是关于组的心跳失败,因为它正在重新平衡的主要内容,如果未能解决你的问题,请参考以下文章