kafka 消费者分区分配

kafka 消费者分区分配,在 kafka-2.2 里有三种实现

《kafka 消费者分区分配》
《kafka 消费者分区分配》

RangeAssignor

每次对一个主题分配消费者,分区数能整除消费者数,则每个消费者得到分区数一样,如果有余数,排在前面的消费者在有多的剩余分区情况下,就会多分配一个分区

比如两个消费者C0,C1;两个主题 t0, t1; 每个主题三个分区 t0p0,t0p1,t0p2;t1p0,t1p1,t1p2;(每个消费者都订阅了每个主题)

C0: [t0p0, t0p1, t1p0, t1p1] // 先分配t0, 消费者按字典序排序往前的得到的多
C1: [t0p2, t1p2]

又比如:三个消费者,两个主题,五个分区 (每个消费者都订阅了每个主题)

C0: [t0p0, t0p1, t1p0, t1p1] // 先分配t0, 消费者按字典序排序往前的得到的多
C1: [t0p2, t0p3, t1p2, t1p3] // 看起来不太均衡
C2: [t0p4, t1p4]

RoundRobinAssignor

主题分区整合在一起,统一分配;构造消费者环,每个消费者循环消费一次(如果该消费者没有订阅该主题则跳到下一个消费者)

比如三个消费者,三个主题分别1,2,3 个分区,消费者1, 2,3 分别订阅了主题1;1,2;1,2,3;

C0: [t0p0]  //字典排序C0 先获取分区C1C2 循环没有订阅主题就跳过
C1: [t1p0]
C2: [t1p1, t2p0, t2p1, t2p2]

StickyAssignor

不仅考虑刚开始分区分配均衡的问题,还同时考虑消费者退出,分区重分配的问题(尽量保留同一分区在同一个消费者上)

比如:三个消费者,三个主题分别1,2,3 个分区,消费者1, 2,3 分别订阅了主题1;1,2;1,2,3;

上面的 RoundRobinAssignor 的 C2,负载过多,StickyAssignor 进一步提高平衡程度

C0: [t0p0]  
C1: [t1p0, t1p1]
C2: [t2p0, t2p1, t2p2]

若移除 C0, RoundRobinAssignor 重分配为

C1: [t0p0, t1p1]
C2: [t1p0, t2p0, t2p1, t2p2] // 比较多少个分区保留了原先的消费者(3)

若移除 C0, StickyAssignor 重分配为

C1: [t1p0, t1p1, t0p0]
C2: [t2p0, t2p1, t2p2] // 比较多少个分区保留了原先的消费者(5)
    原文作者:玩不转的囚
    原文地址: https://zhuanlan.zhihu.com/p/62826329
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞