关于kafka中消费者的分区分配策略

在说分区分配之前我们先要强调一下consumer采用pull(拉)模式从broker中读取数据 。因为push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。

下面我们来看一下如下所示的分区和消费者组的图

在这里插入图片描述

你可能会想这个图中的消费者会消费到主题中的具体哪一个分区的数据,这也引出我们的分区分配策略:一个consumer group中有多个consumer,一个 topic有多个partition,所以必然会涉及到partition的分配问题,即确定那个partition由哪个consumer来消费。

kafka对于消费者来说有两种不同的分配策略: 一种是RoundRobinAssignor (轮询分区),另一种是Range

RoundRobinAssignor 轮询分区:
RoundRobinAssignor策略的原理是将消费组内所有消费者以及消费者所订阅的所有topic的partition按照字典序排序,然后通过轮询消费者方式逐个将分区分配给每个消费者。
而轮询分区又分为以下两种情况:
情况一:同一消费组内所有消费者订阅的消息都是相同的
情况二:同一消费组内所有消费者订阅的消息是不相同的

对于情况一来说:如果同一个消费组内所有的消费者的订阅信息都是相同的,那么RoundRobinAssignor策略的分区分配会是均匀的。

情况一案例:假设此时有一个消费者组,里面有三个消费者c1,c2,c3,并且消费者组中的全部消费者都订阅了全部的主题,主题包含两个,其中T1主题的分区包含p0,p1,p2,T2主题的分区包含p0,p1,p2,p3,p4。所以此时的消费方式是如下图所示,因为是消费者组内订阅的消息都相同,所以直接就可以将分区的顺序依次分配给消费者。

在这里插入图片描述

情况二案例:
假设消费者组里面有T1(包含p0,p1,p2三个分区),T2(包含p0,p1,p2)三个分区,消费者组中包含c1,c2,其中c1订阅的是T1,c2订阅的是T2

在这里插入图片描述

因为按照RoundRobinAssignor这种方式的话他会把主题名+分区号作为hash值进行排序,假设排序完是以后是T2p1,T1p0,T1p2,T2p0,T1p1,T2p2.
那么这样的话最终的分配为

在这里插入图片描述
这样的话和我们消费者订阅的主题会出现矛盾,因为c1只订阅了T1,但是却出现了T2, c2只订阅了T2,但是却出现了T1.
也就是说,情况二的这种轮询策略下,消费者组中的消费者无法特别指定自身要消费的主题。自己指定的主题会被拿出去到整个组中统一分配。自己也会消费到自己没有指定的主题 。这也就是为什么RoundRobinAssignor不是我们默认的分区分配方式。

Range分区分配方式
因为RoundRobinAssignor有以上缺点,所以kafka把range作为默认的分区分配策略,range可以在一个消费者组中单独为指定消费者设置要消费的主题。这里要强调的是
1.range策略针对于每个topic,各个topic之间分配时没有任何关联。
2.range 范围分区策略是通过 partitions数/consumer数 来决定每个消费者应该消费几个分区。如果除不尽,那么前面几个消费者将会多消费1个分区.

案例一:假设kafka集群里面一共就有一个主题T0,T0共包含7个分区,消费者组里面共有三个消费者,那么7%3剩余1.
则分配方案为

在这里插入图片描述

案例二:假如是如下的集群(注:其中c1和c2都是消费T1和T2

在这里插入图片描述

那么经过Range分配以后的话c1: T1p0,T1p1,T2p0,T2p1.
c2: T1p2,T2p2.
现在才有两个主题就出现了c1比c2多分配4个的情况,如果在多出现两个主题的话那c1所消费的分区将会比c2更多。这一点也是Range分配的缺点所在。但好处在于,同一个消费者组的不同消费者可以指定自己单独需要消费的主题,只有当其他消费者与当前消费者指定的主题相同时,才会一起分配这个主题的不同分区

总结:
1.要想使用RoundRobinAssignor的话必须要保障消费者组中所有的消费者所订阅的主题是一样的。
2.RoundRobinAssignor有一个优点就是同一个消费者组的不同消费者之间所消费的分区数量相差最大不会超过1,因为他是轮询的方式来一直分配。
3.RoundRobinAssignor是针对组来分的,而Range针对的是Topic来分的。

猜你喜欢

转载自blog.csdn.net/weixin_44080445/article/details/107309771