当添加或关闭新的消费者/代理时,Kafka 会触发重新平衡操作。Kafka Rebalancing 是阻塞操作吗?重新平衡操作正在进行时,Kafka 消费者是否被阻塞?
2 回答
取决于您所说的“被阻止”是什么意思。如果您的意思是“触发重新平衡时是否关闭了现有连接”,那么答案是肯定的。不幸的是,当前 Kafka 的再平衡算法并不完美。
这是消费者重新平衡期间发生的事情。
假设我们有一个包含 10 个分区 (0-9) 的主题,并且有一个消费者(让我们命名它consumer1
)使用它。当第二个消费者出现时(consumer2
),重新平衡任务为他们两个触发(consumer1
获取一个事件,consumer2
进行初始重新平衡)。现在consumer1
关闭所有现有连接(即使是那些即将重新打开的连接)并释放 Zookeeper 中所有 10 个分区的分区所有权。
然后它运行分区分配算法并决定应该声明哪些分区并再次在 Zookeeper 中声明分区所有权。如果声明成功,则consumer1
开始获取他的新分区。
同时consumer2
运行分区分配算法,并尝试在 Zookeeper 中声明他的分区。consumer1
只有在释放这些分区的所有权时,声明才会成功。当声明成功consumer2
开始获取时,或者如果它未能在给定的重试次数内声明分区,则会出现rebalance failed after n retries
异常。
正如您所注意到的,它不仅关闭连接并释放consumer1
不再拥有的分区的所有权,还不必要地关闭了他的所有连接并仅使用较少数量的分区重新启动。添加分区的情况相同(当我们使用通配符过滤器并出现新主题时) - 所有连接都已关闭然后再次打开,而不是仅打开新连接。
所以我希望这能回答你的问题 - 重新平衡开始时获取停止。
过去接受的回复(来自 serejja)是正确的。Kafka从 2.3 版(发布日期 2019 年 6 月)及更高版本开始实施“增量合作再平衡” 。所以现在不需要所有消费者停止处理(“停止世界事件”)来重新平衡组 fe 中的工作。当新的消费者出现在组中或某些消费者下线时。
有关更多信息,请参阅:Apache Kafka 消费者再平衡中的从渴望到更聪明