Kafka消费者的分区分配策略
在 Kafka内部存在三种默认的分区分配策略:Range和 RoundRobin,Sticky粘性分区。
1.Range是默认策略。Range是对每个Topic而言的(即一个Topic一个Topic分),首先对同一个Topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后用Partitions分区的个数除以消费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。
例如:我们有10个分区,两个消费者(C1,C2),3个消费者线程,10 / 3 = 3而且除不尽。
C1-0 将消费 0, 1, 2, 3 分区
C2-0 将消费 4, 5, 6 分区
C2-1 将消费 7, 8, 9 分区
2.RoundRobin策略:将所有主题分区组成TopicAndPartition列表,然后对TopicAndPartition列表按照hashCode进行排序,最后按照轮询的方式发给每一个消费线程。
3.Sticky粘性分区:我们可以叫他粘粘性分配策略。这种策略主要有两个用途:
(1)首先,它保证分配尽可能平衡,数字分配给消费者的主题分区的数目最多相差一个;或者每个消费者比其他消费者少2个以上的主题分区,则无法将这些主题分区中的任何一个传送给它。
(2)其次,当分区再均衡发生时,它保留了尽可能多的现有赋值。这有助于在主题分区从一个消费者移动到另一个消费者时节省一些开销处理。
当两者发生冲突时,第一个目标优先于第二个目标。鉴于这两个目标,Stickyr策略的具体实现要比Range和RoundRobin这两种分配策略要复杂很多。