Kafka消费者组再平衡

Nob*_*ita 1 apache-kafka kafka-consumer-api

我正在使用 kafka 消费者组管理来处理我的消息。

我的消息的处理时间各不相同。因此,我将最大轮询间隔设置为 20 分钟,最大记录数为 20。除了上述两个之外,我还使用 5 个分区和 5 个具有默认配置值的消费者实例。

但我仍然间歇性地收到以下错误:

[Consumer clientId=consumer-3, groupId=amc_dashboard_analytics] Attempt to heartbeat failed since group is rebalancing
Run Code Online (Sandbox Code Playgroud)

我们的理解是,除非在达到消费者配置文档中写入的最大轮询间隔之前未调用轮询,否则不会发生重新平衡。但对我来说,重新平衡只发生在 20 分钟之前。

此外,在运行几个小时后,所有分配的消费者只是离开并说“尝试检测信号失败,因为组正在重新平衡”,并且不会再次加入(理想情况下应该再次加入)。

我在这里错过了什么吗?任何线索都会有帮助。

H.Ç*_*Ç.T 5

重新平衡的另一个原因是过期session.timeout.ms而不发送心跳。你可以考虑增加这个consumer配置。

来自卡夫卡文档:

heartbeat.interval.ms:使用 Kafka 的组管理工具时,向消费者协调器发送心跳之间的预期时间。心跳用于确保消费者的会话保持活动状态,并在新消费者加入或离开组时促进重新平衡。该值必须设置为低于 session.timeout.ms,但通常不应高于该值的 1/3。它可以调整得更低,以控制正常重新平衡的预期时间。(默认值:3000)


session.timeout.ms:使用 Kafka 的组管理工具时用于检测客户端故障的超时时间。客户端定期发送心跳以向代理表明其活跃度。如果在此会话超时到期之前代理未收到任何心跳,则代理将从组中删除该客户端并启动重新平衡。请注意,该值必须在代理配置中通过 group.min.session.timeout.ms 和 group.max.session.timeout.ms 配置的允许范围内。(默认值:10000)

您可以查看此链接以获取更多信息。

即使通过单独的线程以固定的时间间隔发送心跳,在某些情况下心跳也无法发送到session.timeout.ms. 造成这种情况的一些可能原因是:

  • 网络问题
  • 消费者或经纪商端的停止世界垃圾收集