Kafka之消费者分区分配策略

版权声明:Designed By JiaMingcan https://blog.csdn.net/qq_41571900/article/details/84192989

前言

之前的一篇博客写的是Kafka基础了解一下(附上超链接,可以点进去看看)对Kafka简单介绍了一下。既然我们知道消费者组会协调去消费Topic下的partition,那么它是如何去协调的,是不是也要去了解了解。

简介

Kafka的分区实际上继承了一个接口AbstractPartitionAssignor,而这个接口下有两个实现的类,实现了RoundRobinAssignor和RangeAssignor两种算法。

RoundRobinAssignor

RoundRobin是轮询算法,它会将所有的TopicPartition统一进行分配。如下面的图一样,第一个partition给到consumer1,第二个Partition给到consumer2,以此类推,循环着依次分配。

RangeAssignor

它与前面那个算法不同的是,它是针对每一个Topic单独进行分配。就像下图一样,它会针对每一个Topic下的Partition数量与Consumer来进行划分。
这里我们将Topic下的Partition数量记为p,消费者组里的消费者数量记为c。
(1)p/c求出每个消费者最少可以得到多少个分区,例如这里的Topic01为3, 3/2=1,则c1和c2最少可以获得一个分区。
(2)p%c求出有多少个消费者可以多获取一个分区,再对消费者进行轮询,3%2=1,则只有一个消费者可以多获取一个,那么通过轮询c1得到多一个。
(3)依次对各个Topic进行1、2两步,将所得到的结果相加,就能得到各消费者所消费的分区了。
在这里插入图片描述

对比这两种方法,我们可以看出,第二种算法是存在漏洞的,仅仅看一个Topic可能会造成前几个消费者比后面的多消费一个分区,但是如果消费者组去消费很多个Topic呢?就导致了前几个消费者比后面的多消费很多分区,这样的话就不能充分利用资源。所以现在一般都摒弃了第二种算法,采用第一种,大家可以思考一下,它最后就算是分区不是平均分配,那也就只多出一个分区。

									 summed up by JiaMingcan
									 转载请署名:JiaMingcan

猜你喜欢

转载自blog.csdn.net/qq_41571900/article/details/84192989