在新建一個Consumer時,我們可以通過指定groupId來將其添加進一個Consumer Group中。Consumer Group是為了實現多個Consumer能夠并行的消費一個Topic,并且一個partition只能被一個Consumer Group里的一個固定的Consumer消費。
Consumer Rebalance
對于一個Consumer Group,可能隨時都有Consumer加入或者退出這個Consumer Group,Consumer列表的變化勢必會引起partition的重新分配。這個為Consumer分配partition的過程就被稱為Consumer Rebalance。
出現任何以下的場景都會觸發Consumer Rebalance操作:
- 有新的消費者加入Consumer Group。
- 有消費者主動退出Consumer Group。
- Consumer Group訂閱的任何一個Topic出現分區數量的變化
- ......
默認情況下,Kafka提供了兩種分配策略:Range和RoundRobin。
Range策略
range策略的具體步驟如下:
- 對一個topic中的partition進行排序
- 對消費者按字典進行排序
- 然后遍歷排序后的partition的方式分配給消費者
舉個例子,比如有兩個消費者C0和C1,兩個topic(t0,t1),每個topic有三個分區p(0-2),
那么采用Range策略,分配出的結果為:
- C0: [t0p0, t0p1, t1p0, t1p1]
- C1: [t0p2, t1p2]
RoundRobin策略
RoundRobin策略和Range策略類型,唯一的區別就是Range策略分配partition時,是按照topic逐次劃分的。而RoundRobin策略則是將所有topic的所有分區一起排序,然后遍歷partition分配給消費者。
因此,采用RoundRobin策略,分配出的結果為:
- C0: [t0p0, t0p2, t1p1]
- C1: [t0p1, t1p0, t1p2]
Group Coordinator
Group Coordinator是負責管理Consumer Group的組件。當一個Consumer希望加入某一個Consumer Group時,它會發送一個請求給Group Coordinator。Group Coordinator負責維護一個Consumer Group中所有的Consumer列表,隨著Consumer的加入和退出,Coordinator也會隨之更新這個列表。
第一個加入Consumer Group的Consumer被稱為leader。
一旦Consumer Group中的成員發生變化,例如有新的Consumer加入,那么就需要為其分配partition;或者有Consumer退出,那么就需要將其負責消費的partition分配給組內其他成員。因此Consumer Group中的成員發生變化, Group Coordinator就負責發起Consumer Rebalance活動。
值得注意的是,真正的Consumer Rebalance行為是由Consumer Group Leader執行的。Group Leader首先向Coordinator獲取Group中的Consumer成員列表,然后根據Rebalance策略,將partition分配給Consumer Group中的成員,再將分配結果告知Coordinator。最后,Coordinator將partition分配結果通知給每一個Consumer。在Consumer Rebalance的過程中,所有的Consumer都不允許消費消息。
Producer發送消息到Topic時,分配partition的算法如下:
- 如果指定了一個partition,那么直接使用指定的partition
- 如果沒有指定partition,但是指定了key,那么會根據key進行哈希,分配到對應的partition中
- 如果partition和key都沒指定,會使用round-robin算法進行分配
總結
- Consumer Groups 用于多個Consumer并行消費消息。為了防止兩個消費者重復消費一條消息,Kafka不允許同一個Consumer Group中的兩個Consumer讀取同一個partition。
- Group Coordinator 用于維護Consumer Group信息。
- Consumer Rebalance 是為Consumer Group中的Consumer分配partition的過程。一旦一個Consumer Group中的成員發生變化,就會觸發Rebalance行為。
- Group leader 是第一個加入Consumer Group的Consumer,它負責Consumer Rebalance的執行。
- Consumer Rebalance策略主要有Range和Round Robin。