一个consumer group中有多个consumer,一个topic有多个partition,所以必然会涉及到partition的分配问题,即确定那个partition由哪个consumer来消费。
Kafka有两种分配策略,一是RoundRobin,二是Range
RoundRobin意为“轮循”,假设有一个消费者组,里面有A和B两个消费者。A和B同时订阅了topic T1 和 T2,topic T1 和 T2分别有3个分区,由于一个分区只能由一个消费者消费,那A和B应该分别消费那个主题的那个分区呢?
假设上面topic T1 和 T2的分区总共有五个,那么结果就是A会比B多消费一个分区或者B比A多消费一个分区,所以RoundRobin这种分配方式最多会导致消费者消费的分区数相差一个。
这种分配方式某些情况下可能适合:
假设有两个topic T1、T2,每个topic都有三个分区,然后A订阅了topic T1,B订阅了topic T2。可是RoundRobin是按照组来分配的,它依然会先将所有分区排序,然后逐个分给A和B两个消费者,这可能就会导致T2的分区分给了A,而T1的分区分给了B。可是A没有订阅T2,B也没有订阅T1,所以逻辑混乱。
结论:要想使用RoundRobin分配方式要保证一个消费者组内的所有消费者订阅的是相同的topic。
Range意为“范围”,是Kafka默认的分配方式。假设有一个消费者组,里面有A和B两个消费者。A和B同时订阅了topic T1 和 T2,topic T1 和 T2分别有3个分区,由于一个分区只能由一个消费者消费,那A和B应该分别消费那个主题的那个分区呢?
上面的例子的分配结果是A负责有四个分区而B只负责有两个分区,A和B负责分区相差两个,随着订阅的topic增多A和B负责的分区数相差会越来越大。 但是如果A只订阅了T1,B只订阅了T2,那么T1的分区都会分给A而T2的分区都会分给B,就不会出现RoundRobin里面的那种逻辑混乱。
当消费者组增加或减少消费者时就会触发分配机制进行重新分配。