在手动/分配分区的情况下,kafka用户重新平衡

时间:2019-02-11 18:44:15

标签: apache-kafka

我对再平衡有些疑问。现在,我正在手动将分区分配给使用者。因此,根据文档,万一消费者群体中的消费者休假/崩溃,将不会进行重新平衡。

让我们说在同一组中有3个分区和3个使用者,并且每个分区都是手动分配给每个使用者的。一段时间后,第三位消费者下跌。既然没有重新平衡,我可以采取什么措施来确保最小的停机时间? 我是否需要更改第一个两个分区中的任何一个的配置才能从第三个分区或其他分区开始使用?

2 个答案:

答案 0 :(得分:0)

我不知道您为什么要手动将分区分配给使用者?

我认为您需要编写rebalanceListener。 https://kafka.apache.org/0100/javadoc/org/apache/kafka/clients/consumer/ConsumerRebalanceListener.html

我的建议:让kafka决定哪个消费者将听哪个分区,而您不必为此担心。

答案 1 :(得分:0)

尽管如书面所言,可能存在使该方法有效的上下文,但我还是对您的方法提出了一点质疑。

确保最短停机时间的最佳方法是让kafka经纪人和动物园管理员做他们擅长的事情,管理消费者中的工作负载(分区),包括在消费者出现故障时重新分配分区。

您的最佳路径可能是使用OnPartitionsRevoked和OnpartitionsAssigned事件来处理需要的逻辑,以采用新的分区(有关这些事件的更多详细信息,请参见JRs链接)。

我将描述一个最近的用例,希望它与您的用例相关。 我最近有5个使用者,它们需要在内存中缓存5000万个对象。如果不进行分区,则每个使用者都有自己的缓存,从而产生2.5亿个对象。 为了将该数目减少到最初的5000万,我们可以使用onpartitionsrevoked事件清除缓存,并使用onassigned分配给分配分区的相关缓存重新填充缓存。

短暂使用这两个处理程序,如果您真的想手动分配分区,则必须自己完成所有编排:

  1. 用于监控其他消费者之一是否倒霉的东西
  2. 有一些东西可以选择死者的分区并对其进行处理
  3. 安排消费者之间的通信以在死掉的消费者再次存活时进行通信,以便它可以再次开始工作。

正如您可能从清单中看出的那样,如果您强迫自己走那条路,那么您将处于一个真实的世界,而且您做的工作可能不会比kafka经纪人做得更好-整个公司的业务整个焦点都集中在开发和维护kafka上,因此您不必处理所有的复杂性。