kafka消费者分区分配策略
1、轮询RoundRobin
一个消费者组有多个消费者,会把一个消费者组里的所有消费者指定的全部主题拿出来,再统一按分区分配给该组里面的所有消费者进行消费(按照主题名+分区号排序,轮询分配给组里的所有消费者)。。也就是说,轮询策略下,消费者组中的消费者无法特别指定自身要消费的主题。自己指定的主题会被拿出去到整个组中统一分配。自己也会消费到自己没有指定的主题(不过该主题肯定是由同组的其他消费者指定的)
假设消费者组G有AB两个消费者,
有T1 、T2 两个主题,每个主题都有三个分区,分区好分别是0,1,2。
其中A指定要消费T1 主题,而B指定要消费T2主题。由于A和B属于同一个消费者组G,那么G这个组就会消费AUB(A与B的并集)={T1,T2},共两个主题,六个分区。
(1)也就是说,RoundRobin会让消费者组G的所有成员(A和B)一起轮询消费这六个分区(T1-0,T1-1,T1-2,T2-0,T2-1,T2-2)。
kafka会把六个分区按照主题名+分区号作为hash值进行排序,假设排序完是T1-0,T1-1,T1-2,T2-0,T2-1,T2-2共六个。
然后按照轮询分配。。。A分配T1-0 B分配T1-1 A分配T1-2 B分配T2-0 ......
最终:A分配了T1-0 T1-2 T2-1 三个分区。B则分配了剩下的三个分区。
(2)这样就会导致A可能会消费到T2主题的分区,B也可能会消费到T1主题的分区。而A并没有指定要消费T2分区,B也没有指定要消费T1分区。。这算是一种缺点。。消费到同组的其他消费者所指定的主题分区数据。
由于有以上缺点,kafka没有把轮询策略作为默认策略。。而是把range作为默认的,range可以在一个消费者组中单独为指定消费者设置要消费的主题。
那么什么情况下使用轮询分配策略呢?
在同一个消费者组中的所有消费者各自指定要消费的主题都是一样的情况下,使用轮询分配更好,不会导致不同消费者之间所消费的分区数差距过大(最大差距不会超过1),
而下面的range策略虽然可以让同一个消费者组的不同消费者各自指定自己要消费的主题,但在同一个消费者组中的所有消费者各自指定要消费的主题都是一样的情况下,不同的消费者之间被分配的分区数可能会差距很大。
好处,同一个消费者组的不同消费者之间所消费的分区数量相差最大不会超过1。
缺点,就是一个消费者组中的消费者各自指定消费的主题并不会由这个消费者消费,而是拿出来作为整个组要消费的主题。
2、range策略
会按照主题来进行分配。一个主题的分区分配完了,再继续分配下一个主题。
分配规则:同一个消费者组有哪些成员指定了相同的主题,则由这些成员去消费该主题的分区。其他未指定该主题的成员不会消费到这个主题。
分区分配方式:假设一个主题分区为0~6共7个分区,然后在同一个消费者组中有两个消费者(B、D)消费该主题。
在同一个组内的消费者也会有排序的,按先后顺序分配消费的分区,这里假设顺序是B、D,那么靠前的获取比较多的分区数,靠后的获取较少的分区数。。并且分区分配不是轮询了,而是按范围分配相邻的分区。。。那么7个分区两个消费者,7/2向下取整等于3,则按消费者顺序分配,B会分配4个分区,D会分配3个分区,然后是按范围分配相邻的给同一个消费者,则B会分到0~3这四个分区,D分到4~6这三个。
按上面的情况,假设B和D又同时一起指定要消费另一个主题,这个主题也有7个分区。。那么还是按上面的规则。。B又拿到0~4分区,D又拿到4~6分区。。。此时B有8个分区要消费,而D只有6个。当B和D同时指定的主题数越多,他们俩所消费的分区数差距就会越来越大。。这就是range的缺点。
具体举个例子(如果根据上面的描述就懂了,可以跳过该例子):
假设有主题T1和T2和T3,各自三个分区(0,1,2)。
消费者组G,有两个消费者A和B。
其中A指定要消费T1和T2,B要消费T2和T3.
那么按照每个主题,一个主题一个主题分配给A和B进行消费。
即假设按照T1 T2 T3的顺序来。
(1)先分配主题T1,由于T1只有A消费,那么就直接T1-0,T1-1,T1-2都分配给A消费了。
(2)然后分配主题T2,T2有A和B一起消费,A和B属于同一个消费者组,是Range策略。。。
那么T2-0,T2-1,T2-2三个分区中,会按照轮询规则把三个分区分配给A和B两个消费者。A可能分配到两个分区,B可能分配到1额分区。
(3)最后分配T3主题,由于只有B消费,所有T3全部分区都分配给B消费。
缺点,就是当同一个消费者组的多个消费者消费的主题相同,并且消费的相同主题比较多时,按照上面步骤(2)的情况,可能会导致消费者A消费十个分区,而消费者B只消费了五个分区,这样不平衡。
但好处在于,同一个消费者组的不同消费者可以指定自己单独需要消费的主题。。只有当其他消费者与当前消费者指定的主题相同时,才会一起分配这个主题的不同分区。