我正在研究在我的项目中使用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以提高消费者的利用率?
1条答案
按热度按时间bttbmeg01#
尽管每个分区正好有一个使用者,但是可以将一个使用者分配给多个分区。因此,为了获得最佳性能,您需要将分区数与订阅主题的consumergroup中的使用者数相匹配。
重新平衡是基于消费者的重新平衡策略(见下面的配置),而不是基于流量或工作负载。一旦重新平衡完成,任务就被固定,直到另一个重新平衡发生。
通常,最好避免任何重新平衡,因为在此期间,consumergroup的所有消费者都会暂停,并且不会轮询任何数据。因此,我不会用再平衡来平衡你的工作量。如果不同分区上的通信量如此不同,我宁愿考虑将一些分区拆分为另一个主题,或者将分区拆分为更多的分区。如果你有更多的分区,你可以利用更多的消费者。
partition.assignment.strategy:受支持的分区分配策略的类名或类类型列表,按优先级排序,当使用组管理时,客户端将使用这些策略在使用者示例之间分配分区所有权。除了下面指定的默认类之外,您还可以使用org.apache.kafka.clients.consumer.roundrobinassignorclass将分区的循环分配给使用者。通过实现org.apache.kafka.clients.consumer.consumerpartitionassignor接口,可以插入自定义分配策略。