消费者再平衡如何在卡夫卡工作?

jav*_*eek 32 message-queue producer-consumer apache-kafka kafka-consumer-api

当添加或关闭新的消费者/ brorker时,Kafka会触发重新平衡操作.Kafka Rebalancing是一种阻止操作吗?在重新平衡操作正在进行时,Kafka消费者是否受阻?

ser*_*jja 44

取决于"被阻止"的含义.如果您的意思是"触发重新平衡时现有连接已关闭",则答案为是.遗憾的是,目前Kafka的再平衡算法并不完美.

以下是消费者再平衡期间发生的事情.

假设我们有一个包含10个分区(0-9)的主题,以及一个consumer1使用它的消费者(让它命名).当第二个消费者出现(consumer2)时,重新平衡任务会触发它们(consumer1获取事件,consumer2进行初始重新平衡).现在consumer1关闭所有现有连接(即使是那些将很快重新打开的连接),并在Zookeeper中为所有10个分区释放分区所有权.

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

同时consumer2运行分区分配算法并尝试在Zookeeper中声明其分区.只有在consumer1释放这些分区的所有权时,声明才会成功.当声明成功consumer2开始提取时,或者如果未能在给定的重试次数内声明分区,则会出现rebalance failed after n retries异常.

正如您所注意到的那样,不再仅仅关闭连接并释放分区的所有权consumer1不再拥有,它会不必要地关闭所有连接并重新启动,只需较少的分区.添加分区的相同故事(当我们通过通配符过滤器和新主题消耗时) - 所有连接都关闭然后再次打开而不是仅打开新连接.

所以我希望这能解决你的问题 - 在重新平衡开始时取消停止.

  • 很详细的回答。你能不能解释一下为什么当一个topic有3个分区和一个consumer时,为什么当我重新启动consumer时,consumer group重新平衡需要大约一个小时? (2认同)

use*_*729 7

上面接受的回应(来自serejja)在过去是正确的。Kafka从2.3版本(发布日期2019年6月)及更高版本开始实现“增量合作再平衡”。因此,现在不需要所有消费者停止处理(“停止世界事件”)来重新平衡 fe 组中的工作。当群组中出现新的消费者或者某个消费者离线时。

有关更多信息,请参阅:Apache Kafka 消费者重新平衡中的从渴望到聪明