详解Kafka分区分配策略

tech2022-07-10  171

前言:

一个consumer group中有多个consumer,一个topic有多个partition,所以必然会涉及到partition的分配问题,即确定那个partition由哪个consumer来消费。

Kafka有两种分配策略,一是RoundRobin,二是Range

1. RoundRobin

RoundRobin意为“轮循”,假设有一个消费者组,里面有A和B两个消费者。A和B同时订阅了topic T1 和 T2,topic T1 和 T2分别有3个分区,由于一个分区只能由一个消费者消费,那A和B应该分别消费那个主题的那个分区呢?

1.1 RoundRobin的分配方式
1)首先RoundRobin会对两个topic里面的分区进行排序,规则是按照 topic名+分区数 的哈希值进行排序。2)排序后,会将所以分区逐个分给不同的消费者。假设排好的顺序为 T1-0、T2-0、T1-1、T1-2,T2-1、T2-2,那么T1-0就会分给消费者A,然后T2-0分给消费者B,T1-1再分给A…以此类推,直到把所有的分区分配完。
1.2 RoundRobin分配再说明

假设上面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。

2. Range

Range意为“范围”,是Kafka默认的分配方式。假设有一个消费者组,里面有A和B两个消费者。A和B同时订阅了topic T1 和 T2,topic T1 和 T2分别有3个分区,由于一个分区只能由一个消费者消费,那A和B应该分别消费那个主题的那个分区呢?

2.1 Range的分配方式
1)Range是按主题分配的。 首先拿topic T1的分区数模以消费者组里面的订阅了它的消费者个数,T1里面有3个分区模以A和B两个消费者无法模尽(3 % 2 = 1),所以 T1-0 和 T1-1两个分区就会分给A,而T1-2分区就会分给B。2)topic T2的分区分配和T1一样。
2.2 Range分配方式的再说明

上面的例子的分配结果是A负责有四个分区而B只负责有两个分区,A和B负责分区相差两个,随着订阅的topic增多A和B负责的分区数相差会越来越大。 但是如果A只订阅了T1,B只订阅了T2,那么T1的分区都会分给A而T2的分区都会分给B,就不会出现RoundRobin里面的那种逻辑混乱。

3. 分配方式的触发条件

当消费者组增加或减少消费者时就会触发分配机制进行重新分配。

最新回复(0)