当添加或下线新的消费者/代理时,Kafka 会触发重新平衡操作。 Kafka 的重新平衡是阻塞操作吗?在重新平衡操作正在进行时,Kafka 消费者是否会被阻塞?
视"blocked"的含义而定。如果指的是在触发重新平衡时现有连接是否会关闭,则答案是肯定的。当前的Kafka重新平衡算法遗憾地不完美。
以下是消费者重新平衡期间发生的情况。
假设我们有一个包含10个分区(0-9)的主题,并且有一个消费者(命名为consumer1
)正在消费它。当出现第二个消费者(consumer2
)时,两者都会触发重新平衡任务(consumer1
收到事件,consumer2
执行初始重新平衡)。现在,consumer1
关闭所有现有连接(甚至是即将重新打开的连接),并释放Zookeeper中所有10个分区的分区所有权。
然后,它运行分区分配算法并确定应该声明哪些分区,并再次在Zookeeper中声明分区所有权。如果声明成功,则consumer1
开始获取它的新分区。
同时,consumer2
也运行分区分配算法并尝试在Zookeeper中声明其分区所有权。只有当consumer1
释放对这些分区的所有权时,声明才会成功。如果声明失败,则在给定数量的重试后,您将收到一个rebalance failed after n retries
异常。
正如您所注意到的,consumer1
不仅会关闭连接并释放不再拥有的分区所有权,而且还会不必要地关闭所有连接,然后使用较少的分区重新启动。添加分区时也是如此(当我们通过通配符过滤器进行消费并出现新主题时)-关闭了所有连接,然后重新打开而不是只打开新连接。
因此,我希望这回答了您的问题-在重新平衡时获取会停止。