kafka的轮询(Round Robin)与Range

问:Kafka分区分配的概念?答如全文

一个consumer group中有多个consumer,一个 topic有多个partition,所以必然会涉及到partition的分配问题,即确定哪个partition由哪个consumer来消费
Kafka有两种分配策略,一是RoundRobin,二是Range

分区分配策略之Round Robin

RoundRobin原理.png

如下图,消费者A订阅了topicA(TA),消费者B订阅了topicB(TB),topicA由若干分区(TA0,TA1,TA2)组成,topicB由若干分区(TB0,TB1,TB2)组成,则消费者A有可能接收到自己没订阅的topicB的分区TB0、TB1,消费者B有可能接收到自己没订阅的topicA的分区TA1、TA2。

RoundRobin场景

注意,一个消费者是一个线程
变种问题:
RoundRobin模式下,一个topic有10个分区,现在消费者组里面起了10个线程(其实就是10个消费者),问一个消费者能否拿到多个分区的数据?
答:不能。在轮询规则下,一个消费者只能拿到一个分区的数据。

分区分配策略之Range

如下图,三个消费者均订阅了同一主题,则每个消费者消费到不同的分区;但是当topic的分区数较大时,同一个topic的分区,可能在消费者之间分布得不均衡

range原理

如下图,消费者A,B都订阅了TopicA、TopicB,但TA0--TA99都被分到了ConsumerA,而TA100被分到了ConsumerB,这就不均衡了。

range场景