Kafka提供了消费者客户端参数partition.assignment.strategy
来设置消费者与订阅主题之间的分区分配策略。
默认值: org.apache.kafka.clients.consumer.RangeAssignor
此外还提供了另外两种分配策略:
- RoundRobinAssignor
- StickyAssignor
RangeAssignor 分配策略的原理是按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。
对于每一个主题,RangeAssignor策略会将消费组内所有订阅这个主题的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区。
RoundRobinAssignor分配策略的原理是将消费组内所有消费者及消费者订阅的所有主题的分区按照字典序排序,然后通过轮询方式逐个将分区依次分配给每个消费者。
RoundRobinAssignor分配策略对应的 partition.assignment.strategy 参数值为org.apache.kafka.clients.consumer.RoundRobinAssignor。
“sticky”这个单词可以翻译为“黏性的”
Kafka从0.11.x版本开始引入这种分配策略,它主要有两个目的:
- (1)分区的分配要尽可能均匀。
- (2)分区的分配尽可能与上次分配的保持相同。
Kafka还提供了一个抽象类,简化实现PartitionAssignor 接口的工作
org.apache.kafka.clients.consumer.internals.AbstractPartitionAssignor
大部分情况下默认分配策略就可以了。