一:kafka有四种分区分配策略

1.RoundRobin
2.Range
3.Sticky(粘性)
4.CooperativeSticky(合作者粘性)后面版本加的分配策略
修改kafka分区分配策略:partition.assignment.strategy= range+CooperativeStucky(默认值) 或 roundrobin,kafka可以同时使用多个分区分配策略。

二:RoundRobin策略详解

RoundRobin是针对所有topic分区。它是采用轮询分区策略,是把所有的partition和所有的consumer列举出来,然后按照hashcode进行排序,最后再通过轮询算法来分配partition给每个消费者。
在这里插入图片描述

三:Range策略详解

Range策略是kafka默认的消费者分区分配策略,它是针对topic维度的首先对同一个topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序
在这里插入图片描述

如图,假如现在有7个分区,3个消费者,排序后分区的顺序是0-6,消费者排完序后是C0-C2。
通过partition数/consumer数来决定每个消费者应该消费几个分区,如果除不尽的话排名靠前的消费者将会多消息一个分区,上图所示为7/3,即优先每个消费者分别消费两个分区,还多出来一个分区则由C0消费。以此类推,当有8个分区时则前两个消费者分别消费3个分区,最后一个消费者消费2个分区。
缺点:容易产生数据倾斜,如果是针对少量的topic而言C0多消费一个分区的数据影响不大,但是针对成百上千个topic那么C0就要多消费成百上千的分区数。

四:Sticky策略详解

粘性分区定义:可以理解为分配的结果带有“粘性的”。即在执行一次新的分配之前,考虑上一次分配的结果。尽量少的调整分配的变动,可以节省大量的开销。
粘性分区是由Kafka从0.11x版本开始引入的分配策略,首先会尽量均衡的分配分区到消费者上面,在出现同一消费组内消费者出现问题的时候,会尽量保持原来的分配的分区不变。
初始分配分区的方法与Range相似,但是不同。还是拿7个分区3个消费者为例。消费者消费的分区依旧是3、2、2,但是不同与Range的是Range分区是排好序的,如上图C0分配的是partition0、partition1、partition2分区,但是粘性分区C0不一定就是指定这三个分区,而是随机的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐