Kafka 能否仅根据流量将分区重新分配给另一个消费者?

Can Kafka reassign partition to another consumer based solely on traffic?

我正在研究在我的项目中使用 Kafka 作为具有强大消息处理顺序保证的消息代理的可能性。

我了解到,在 Kafka 中,主题被分成多个分区,每个分区都会分配一个消费者(假设只有一个消费者组)。这有利于保持秩序。重新平衡是将分区重新分配给消费者的过程,当分区数量或消费者数量发生变化(失败,添加新工人)时触发。

是否有可能在不改变消费者数量的情况下即时利用该重新平衡?

假设我们有以下场景:

                P1 -- C1

heavytraffic -> P2 -- C2
heavytraffic -> P3 --/    

因此消费者 C1 仅处理 P1 分区,而 C2 分配了两个分区:P2、P3。 假设 P2,P3 上的流量很大,但 P1 空闲。

                P1 -- C1
heavytraffic -> P2 --/
 
heavytraffic -> P3 -- C2

Kafka有什么办法可以重新分配例如P2到C1来提高消费者的利用率吗?

虽然每个分区只有一个消费者,但一个消费者可以分配给多个分区。因此,为了获得最佳性能,您需要将分区数量与 ConsumerGroup 中订阅该主题的消费者数量相匹配。

重新平衡基于消费者重新平衡策略(参见下面的配置),而不是基于流量或工作负载完成。一旦重新平衡完成,分配就会固定,直到发生另一个重新平衡。

通常,最好避免任何重新平衡,因为在此期间 ConsumerGroup 的所有消费者都暂停并且不会轮询任何数据。因此,我不会使用重新平衡来平衡您的工作量。如果各个分区上的流量如此不同,我宁愿考虑将一些分区拆分为另一个主题或将分区拆分为更多分区。如果你有更多的分区,你可以使用更多的消费者。

partition.assignment.strategy: A list of class names or class types, ordered by preference, of supported partition assignment strategies that the client will use to distribute partition ownership amongst consumer instances when group management is used. In addition to the default class specified below, you can use the org.apache.kafka.clients.consumer.RoundRobinAssignorclass for round robin assignments of partitions to consumers. Implementing the org.apache.kafka.clients.consumer.ConsumerPartitionAssignor interface allows you to plug in a custom assignment strategy.