1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| RangeAssignor(默认) Consumer总数x Partition总数y 区间值i = y / x 余数值j = y % x 按顺序,每个Consumer顺序分配j+1个Partition,不能均分后面的Consumer分配j个Partition 8个Partition,3个Consumer,i=2,j=2 c0 = [p0,p1,p2] c1 = [p3,p4,p5] c2 = [p6,p7] 这种分配在多topic中,且partition数不一致情况下,排在前面的Consumer会分配到大量的partition,造成负载倾斜
RoundRobinAssignor 按照轮询进行分配 8个Partition,3个Consumer,i=2,j=2 c0 = [p0,p3,p6] c1 = [p1,p4,p7] c2 = [p2,p5] 即便多个topic,partition数量不一致,也可以保证分配基本平均 但是当Consumer订阅不同的Topic时,同样会产生倾斜
StickyAssignor(0.11) Partition分配尽量平均,重分配时,尽量保留上一次的分配,尽量少将已经分配了的Partition分配给其他Consumer 如果发生冲突,则优先保证平均分配 详细代码去看 org.apache.kafka.clients.consumer.internals.AbstractStickyAssignor;
自定义分配策略 自定义实现PartitionAssignor或AbstractPartitionAssignor 重写assign方法
|