在新建一個Consumer時亭枷,我們可以通過指定groupId來將其添加進一個Consumer Group中。Consumer Group是為了實現(xiàn)多個Consumer能夠并行的消費一個Topic辨绊,并且一個partition只能被一個Consumer Group里的一個固定的Consumer消費奶栖。
Consumer Rebalance
對于一個Consumer Group匹表,可能隨時都有Consumer加入或者退出這個Consumer Group门坷,Consumer列表的變化勢必會引起partition的重新分配宣鄙。這個為Consumer分配partition的過程就被稱為Consumer Rebalance。
出現(xiàn)任何以下的場景都會觸發(fā)Consumer Rebalance操作:
- 有新的消費者加入Consumer Group默蚌。
- 有消費者主動退出Consumer Group冻晤。
- Consumer Group訂閱的任何一個Topic出現(xiàn)分區(qū)數(shù)量的變化
- ......
默認情況下,Kafka提供了兩種分配策略:Range和RoundRobin绸吸。
Range策略
range策略的具體步驟如下:
- 對一個topic中的partition進行排序
- 對消費者按字典進行排序
- 然后遍歷排序后的partition的方式分配給消費者
舉個例子鼻弧,比如有兩個消費者C0和C1,兩個topic(t0,t1)锦茁,每個topic有三個分區(qū)p(0-2)攘轩,
那么采用Range策略,分配出的結(jié)果為:
- C0: [t0p0, t0p1, t1p0, t1p1]
- C1: [t0p2, t1p2]
RoundRobin策略
RoundRobin策略和Range策略類型码俩,唯一的區(qū)別就是Range策略分配partition時度帮,是按照topic逐次劃分的。而RoundRobin策略則是將所有topic的所有分區(qū)一起排序稿存,然后遍歷partition分配給消費者笨篷。
因此,采用RoundRobin策略瓣履,分配出的結(jié)果為:
- C0: [t0p0, t0p2, t1p1]
- C1: [t0p1, t1p0, t1p2]
Group Coordinator
Group Coordinator是負責管理Consumer Group的組件率翅。當一個Consumer希望加入某一個Consumer Group時,它會發(fā)送一個請求給Group Coordinator袖迎。Group Coordinator負責維護一個Consumer Group中所有的Consumer列表冕臭,隨著Consumer的加入和退出,Coordinator也會隨之更新這個列表瓢棒。
第一個加入Consumer Group的Consumer被稱為leader见秤。
一旦Consumer Group中的成員發(fā)生變化描函,例如有新的Consumer加入,那么就需要為其分配partition;或者有Consumer退出荧关,那么就需要將其負責消費的partition分配給組內(nèi)其他成員。因此Consumer Group中的成員發(fā)生變化勇皇, Group Coordinator就負責發(fā)起Consumer Rebalance活動佛呻。
值得注意的是,真正的Consumer Rebalance行為是由Consumer Group Leader執(zhí)行的跺撼。Group Leader首先向Coordinator獲取Group中的Consumer成員列表窟感,然后根據(jù)Rebalance策略,將partition分配給Consumer Group中的成員歉井,再將分配結(jié)果告知Coordinator柿祈。最后,Coordinator將partition分配結(jié)果通知給每一個Consumer。在Consumer Rebalance的過程中躏嚎,所有的Consumer都不允許消費消息蜜自。
Producer發(fā)送消息到Topic時,分配partition的算法如下:
- 如果指定了一個partition卢佣,那么直接使用指定的partition
- 如果沒有指定partition重荠,但是指定了key,那么會根據(jù)key進行哈希虚茶,分配到對應的partition中
- 如果partition和key都沒指定戈鲁,會使用round-robin算法進行分配
總結(jié)
- Consumer Groups 用于多個Consumer并行消費消息。為了防止兩個消費者重復消費一條消息嘹叫,Kafka不允許同一個Consumer Group中的兩個Consumer讀取同一個partition婆殿。
- Group Coordinator 用于維護Consumer Group信息。
- Consumer Rebalance 是為Consumer Group中的Consumer分配partition的過程罩扇。一旦一個Consumer Group中的成員發(fā)生變化鸣皂,就會觸發(fā)Rebalance行為。
- Group leader 是第一個加入Consumer Group的Consumer暮蹂,它負責Consumer Rebalance的執(zhí)行寞缝。
- Consumer Rebalance策略主要有Range和Round Robin。