在上一篇文章中,我们为大家详细介绍可 Kafka 的原理与核心概念,包括控制器选举及恢复、分区 leader 的选举等,本次我们来为大家详细讲解 Kafka 等分区分配策略,希望能对大家有所帮助
Kafka 提供了消费者客户端参数 partition.assignment.strategy⽤来设置消费者与订阅主题之间的分区分配策略。默认情况下此参数的值为:org.apache.kafka.clients.consumer.RangeAssignor,即采⽤ RangeAssignor 分配策略。除此之外,Kafka 中还提供了另外两种分配策略: RoundRobinAssignor 和 StickyAssignor。消费者客户端参数 partition.asssignment.strategy 可以配置多个分配策略,彼此之间以逗号分隔。
RangeAssignor 分配策略
RangeAssignor 策略的原理是按照消费者总数和分区总数进⾏整除运算来获得⼀个跨度,然后将分区按照跨度进⾏平均分配,以保证分区尽可能均匀地分配给所有的消费者。对于每⼀个 topic,
RangeAssignor 策略会将消费组内所有订阅这个 topic 的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配⼀个分区。
假设 n=分区数/消费者数量,m=分区数 %消费者数量,那么前 m 个消费者每个分配 n+1 个分区,后⾯的(消费者数量-m)个消费者每个分配 n 个分区。如果消费组内有 2 个消费者 C0 和 C1,且都订阅了主题 t0 和 t1,并且每个主题都有 4 个分区,那么所订阅的所 有分区可以标识为:t0p0、t0p