消费者分配策略
一个consumer group中有多个consumer,一个topic有多个partition,所以必然会涉及到partition的分配问题,即确定哪个partition由哪个consumer来消费,Kafka提供了3种消费者分区分配策略:RangeAssigor、RoundRobinAssignor、StickyAssignor。
PartitionAssignor接口用于用户定义实现分区分配算法,以实现Consumer之间的分区分配,消费组的成员订阅它们感兴趣的Topic并将这种订阅关系传递给作为订阅组协调者的Broker,协调者选择其中的一个消费者来执行这个消费组的分区分配并将分配结果转发给消费组内所有的消费者,Kafka默认采用RangeAssignor的分配算法。
RangeAssignor
RangeAssignor对每个Topic进行独立的分区分配
对于每一个Topic,首先对分区按照分区ID进行排序,然后订阅这个Topic的消费组的消费者再进行排序,之后尽量均衡的将分区分配给消费者,这里只能是尽量均衡,因为分区数可能无法被消费者数量整除,那么有一些消费者就会多分配到一些分区
计算规则
上述简单来说就是分区总数/消费线程数,如果有余,则表明有的消费线程之间分配的分区不均匀,那么这个多出来的分区会给前几个消费线程处理。
比如上述7个分区,3个comsumer,则7/3=2,余1,这个表明如果3个消费线程均分7个分区还会多出1个分区,那么这个多出的额外分区就会给前面的消费线程处理,所以它会把第一个分区先给到contomer-1
消费线程消费
配置方式
我们只需要如下配置即可以实现如下功能
KafkaConstant.CONSUMER_PROPERTIES.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "org.apache.kafka.clients.consumer.RangeAssignor");
RoundRobinAssignor
将所有可用partitions和consumers展开(字典排序),以轮询的方式将partitions依次分配给consumers。
如果consuemrs订阅Topics都是相同的,那么partitions将会被均匀分配给每个consumer,最理想的状态是partitions数是consumers数的整数倍,这样每个consumer都有相同数量的partitions数。
分配规则
这个分区分配策略简单来说就是列出所有的分区,然后和消费线程之间进行循环的分配即可
如果你需要使用该分配策略,你需要满足所有的消费线程都是消费相同的topic,且每个消费者之间的消费线程数是一样的
配置方式
我们只需要如下配置即可实现该功能
KafkaConstant.CONSUMER_PROPERTIES.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "org.apache.kafka.clients.consumer.RoundRobinAssignor");
StickyAssignor
StickyAssignor分区分配算法,目的是在执行一次新的分配时,能在上一次分配的结果的基础上,尽量少的调整分区分配的变动,节省因分区分配变化带来的开销。
Sticky是“粘性的”,可以理解为分配结果是带“粘性的”——每一次分配变更相对上一次分配做最少的变动,其目标有两点:
- 首先,尽可能保证分区分配均衡(即分配给consumers的分区数最大相差为1);
- 其次,当发生分区重分配时,尽可能多的保留现有的分配结果。
当这两个目标发生冲突时,优先保证第一个目标,第一个目标是每个分配算法都尽量尝试去完成的,而第二个目标才真正体现出StickyAssignor
特性的。
分配规则
StickyAssignor
的分配规则很麻烦,主要的作用就是尽量的实现均衡,然后尽量减少分区变化
配置方式
KafkaConstant.CONSUMER_PROPERTIES.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "org.apache.kafka.clients.consumer.StickyAssignor");
标签:StickyAssignor,消费,狂野,分配,线程,超强,kafka,consumer,分区
From: https://www.cnblogs.com/xieshier/p/16864529.html