kafka侦听线程数对消费者消费对应分区的分配影响

背景:topic:topic.test1;  消费者组:test1.group1,含消费者a0,a1; 消费者组test1.group1,含消费者b0,b1

往mes发送消息,按理来说,应该是a0,a1及b0,b1轮流消费,但实际是仅a0参与了消费,a1靠边,bo,b1是轮流消费的。跟踪源码发现问题在配置文件中的,listerner.concurrency,我配置的是5.

如果配置的是5,那么一个@KafkaListener注解的方法,会生成5个消费者。

在ConcurrentMessageListenerContainer.dostart方法中,按concurrency来for循环,生成concurrency个consumer,最后结果就是有10个消费者,而不是我认为的a0,a1两个

 

 

那么这10个消费者怎么分配呢,默认分配方式为RangeAssignor:

RangeAssignor策略的原理是按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。对于每一个topic,RangeAssignor策略会将消费组内所有订阅这个topic的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区。

假设n=分区数/消费者数量,m=分区数%消费者数量,那么前m个消费者每个分配n+1个分区,后面的(消费者数量-m)个消费者每个分配n个分区。
a0对应有5个消费者(线程),只有两个分区,a0就把这两个分区分配完了。

 

posted on 2021-03-10 14:11  龙甲第  阅读(589)  评论(0)    收藏  举报