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



我正在研究在我的项目中使用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:支持的分区分配策略的类名或类类型列表,按首选项排序,当使用组管理时,客户端将使用这些策略在使用者实例之间分配分区所有权。除了下面指定的默认类之外,您还可以使用org.apache.kafka.clients.consumer.RoundRobinAssignorclass向使用者循环分配分区。通过实现org.apache.kafka.clients.csumer.ConsumerPartitionAssignor接口,可以插入自定义分配策略。

最新更新