Kafka 再平衡算法是否能够跨主题实现平衡?

ser*_*y_o 5 apache-kafka kafka-consumer-api

Kafka 再平衡算法可以跨主题工作吗?

假设我有 5 个主题,每个主题有 10 个分区,同一消费者组中有 20 个消费者应用程序实例,每个实例都订阅这 5 个主题。

Kafka 会尝试在 20 个实例中均匀平衡 50 个分区吗?

或者它只会在一个主题内平衡,因此第一个 10 个实例可能(或可能)接收所有 50 个分区,而其他 10 个实例可能保持空闲状态?

我知道过去 Kafka 并没有在主题之间保持平衡,但是现在的版本又如何呢?

mik*_*ike 4

消费者实例到分区的分配取决于消费者配置 partition.assignment.strategy。它的默认值是,class org.apache.kafka.clients.consumer.RangeAssignor但您也可以选择RoundRobinAssignorStickyAssignor或者您甚至可以通过扩展抽象类来构建自己的策略AbstractPartitionAssignor

我认为对于您的情况,循环分配策略将导致更平衡的分配。Range 策略RoundRobin策略之间的区别如下图所示。

在此输入图像描述

在您的情况下(每个主题中有 10 个分区和 20 个消费者实例),范围策略将导致 10 个实例空闲。然而,使用RoundRobin策略将使所有实例保持忙碌,因为它遵循以下原则:分区将均匀分布,因为分配之间的最大差异应该是一个分区。

请注意,消费者对主题分区的分配与重新平衡不同。当以下情况时启动重新平衡

  • 消费者离开消费者组(例如,通过未能发送心跳或明确请求离开)

  • 新消费者加入 ConsumerGroup

  • 消费者更改其主题订阅

  • 订阅主题的变化,例如分区的增加/减少。

在重新平衡期间,整个 ConsumerGroup 的消费将暂停,并且分配将根据您选择的策略再次进行。

  • 如果您有一个消费者组读取多个主题,您通常希望在消费者中加入数据。完成此操作后,通常最好将主题共同分区并且组内的使用者拥有执行联接所需的所有数据。 (2认同)