【问题标题】:kafka consumer rebalancing in case of manual/assigned partitioning在手动/分配分区的情况下,kafka 消费者重新平衡
【发布时间】:2019-05-31 02:00:54
【问题描述】:

我对再平衡有些疑问。现在,我正在手动将分区分配给消费者。因此,根据文档,如果消费者离开/在消费者群体中崩溃,则不会再平衡。

假设同一组中有 3 个分区和 3 个消费者,每个分区是手动分配给每个消费者的。一段时间后,第三个消费者下降了。由于没有再平衡,我可以采取哪些措施来确保最短的停机时间? 我是否需要更改第一个两个分区中的任何一个的配置才能从第三个分区或其他分区开始消费?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    我不知道你为什么要手动为消费者分配分区?

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

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

    【讨论】:

    • 在手动分配(由其他人完成)的情况下,我们能否得到分配给消费者的分区数量?
    【解决方案2】:

    尽管可能存在使该方法有效的上下文,但正如所写,我对您的方法有一点质疑。

    确保最短停机时间的最佳方法是让 kafka 代理和 zookeeper 做他们擅长的事情,管理您的消费者之间的工作负载(分区),其中包括在消费者宕机时重新分配分区。

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

    我将描述我最近遇到的一个用例,希望它与您的用例相关。 我最近有 5 个消费者需要 5000 万个对象的内存缓存。在没有分区的情况下,每个消费者都有自己的缓存,从而产生 2.5 亿个对象。 要将这个数字减少到原来的 5000 万,我们可以使用 onpartitionsrevoked 事件来清除缓存,并使用 onassigned 使用已分配分区的相关缓存重新填充缓存。

    没有使用这两个处理程序,如果你真的想手动分配你的分区,你将不得不自己做所有的编排:

    1. 在其他消费者之一关闭时要监控的东西
    2. 一些东西可以拾起死去的消费者的分区并处理它
    3. 协调消费者之间的通信,以便在死去的消费者再次活着时进行通信,以便它可以重新开始工作。

    正如您可能从列表中看出的那样,如果您强迫自己走这条路,那么您将进入一个真实的世界,而且您可能不会比 kafka 经纪人做得更好 - 整个企业的整个重点都是开发和维护 kafka,因此您不必处理所有这些复杂性。

    【讨论】:

    • 我们能得到分配给消费者的分区数量和剩余的分区数量吗?
    猜你喜欢
    • 2021-01-26
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2017-06-19
    • 2020-08-04
    • 2019-06-09
    相关资源
    最近更新 更多