【发布时间】:2019-05-31 02:00:54
【问题描述】:
我对再平衡有些疑问。现在,我正在手动将分区分配给消费者。因此,根据文档,如果消费者离开/在消费者群体中崩溃,则不会再平衡。
假设同一组中有 3 个分区和 3 个消费者,每个分区是手动分配给每个消费者的。一段时间后,第三个消费者下降了。由于没有再平衡,我可以采取哪些措施来确保最短的停机时间? 我是否需要更改第一个两个分区中的任何一个的配置才能从第三个分区或其他分区开始消费?
【问题讨论】:
标签: apache-kafka
我对再平衡有些疑问。现在,我正在手动将分区分配给消费者。因此,根据文档,如果消费者离开/在消费者群体中崩溃,则不会再平衡。
假设同一组中有 3 个分区和 3 个消费者,每个分区是手动分配给每个消费者的。一段时间后,第三个消费者下降了。由于没有再平衡,我可以采取哪些措施来确保最短的停机时间? 我是否需要更改第一个两个分区中的任何一个的配置才能从第三个分区或其他分区开始消费?
【问题讨论】:
标签: apache-kafka
我不知道你为什么要手动为消费者分配分区?
我认为你需要编写 rebalanceListener。 https://kafka.apache.org/0100/javadoc/org/apache/kafka/clients/consumer/ConsumerRebalanceListener.html
我的建议:让 kafka 决定哪个消费者将听哪个分区,您不必担心这个。
【讨论】:
尽管可能存在使该方法有效的上下文,但正如所写,我对您的方法有一点质疑。
确保最短停机时间的最佳方法是让 kafka 代理和 zookeeper 做他们擅长的事情,管理您的消费者之间的工作负载(分区),其中包括在消费者宕机时重新分配分区。
您的最佳路径可能是使用 OnPartitionsRevoked 和 OnpartitionsAssigned 事件来处理您需要能够假定新分区的任何逻辑(有关这些事件的更多详细信息,请参见 JRs 链接)。
我将描述我最近遇到的一个用例,希望它与您的用例相关。 我最近有 5 个消费者需要 5000 万个对象的内存缓存。在没有分区的情况下,每个消费者都有自己的缓存,从而产生 2.5 亿个对象。 要将这个数字减少到原来的 5000 万,我们可以使用 onpartitionsrevoked 事件来清除缓存,并使用 onassigned 使用已分配分区的相关缓存重新填充缓存。
没有使用这两个处理程序,如果你真的想手动分配你的分区,你将不得不自己做所有的编排:
正如您可能从列表中看出的那样,如果您强迫自己走这条路,那么您将进入一个真实的世界,而且您可能不会比 kafka 经纪人做得更好 - 整个企业的整个重点都是开发和维护 kafka,因此您不必处理所有这些复杂性。
【讨论】: