Kafka中的消费者再平衡是如何工作的?

42
当添加或下线新的消费者/代理时,Kafka 会触发重新平衡操作。 Kafka 的重新平衡是阻塞操作吗?在重新平衡操作正在进行时,Kafka 消费者是否会被阻塞?
2个回答

54

视"blocked"的含义而定。如果指的是在触发重新平衡时现有连接是否会关闭,则答案是肯定的。当前的Kafka重新平衡算法遗憾地不完美。

以下是消费者重新平衡期间发生的情况。

假设我们有一个包含10个分区(0-9)的主题,并且有一个消费者(命名为consumer1)正在消费它。当出现第二个消费者(consumer2)时,两者都会触发重新平衡任务(consumer1收到事件,consumer2执行初始重新平衡)。现在,consumer1关闭所有现有连接(甚至是即将重新打开的连接),并释放Zookeeper中所有10个分区的分区所有权。

然后,它运行分区分配算法并确定应该声明哪些分区,并再次在Zookeeper中声明分区所有权。如果声明成功,则consumer1开始获取它的新分区。

同时,consumer2也运行分区分配算法并尝试在Zookeeper中声明其分区所有权。只有当consumer1释放对这些分区的所有权时,声明才会成功。如果声明失败,则在给定数量的重试后,您将收到一个rebalance failed after n retries异常。

正如您所注意到的,consumer1不仅会关闭连接并释放不再拥有的分区所有权,而且还会不必要地关闭所有连接,然后使用较少的分区重新启动。添加分区时也是如此(当我们通过通配符过滤器进行消费并出现新主题时)-关闭了所有连接,然后重新打开而不是只打开新连接。

因此,我希望这回答了您的问题-在重新平衡时获取会停止。


3
非常详细的回答。请问您能否解释一下,当有一个具有3个分区和单个消费者的主题时,为什么当我重新启动消费者时,需要大约一小时才能使消费者组重新平衡? - giannisapi

7
过去,上面接受的回复(来自serejja)是正确的。从Kafka 2.3版本(发布日期为2019年6月)开始,Kafka实现了"增量合作再平衡"。因此,现在没有必要让所有消费者停止处理("停止世界事件"),以便在组中重新平衡工作,当新的消费者出现在组中或某些消费者下线时。
更多信息请参见:从渴望到聪明的Apache Kafka消费再平衡

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接