消費組和消費者概念
24154608_yl1d.jpg.png
- 每個consumer客戶端被創建時,會向zookeeper注冊自己的信息;
- 同一個Consumer Group中的Consumers,Kafka將相應Topic中的每個消息只發送給其中一個Consumer。
- Consumer Group中的每個Consumer讀取Topic的一個或多個Partitions,并且是唯一的Consumer;
- 一個Consumer group的多個consumer的所有線程依次有序地消費一個topic的所有partitions,如果Consumer group中所有consumer總線程大于partitions數量,則會出現空閑情況;
舉例:
- kafka集群中創建一個topic為report-log 4 partitions 索引編號為0,1,2,3, 假如有目前有三個消費者node。
- 如果每個consumer創建一個consumer thread線程,各個node消費情況如下,node1消費索引編號為0,1分區,node2費索引編號為2,node3費索引編號為3。
- 如果每個consumer創建2個consumer thread線程,各個node消費情況如下(是從consumer node先后啟動狀態來確定的),node1消費索引編號為0,1分區;node2費索引編號為2,3;node3為空閑狀態。
總結:從以上可知,Consumer Group中各個consumer是根據先后啟動的順序有序消費一個topic的所有partitions的。
如果Consumer Group中所有consumer的總線程數大于partitions數量,則可能consumer thread或consumer會出現空閑狀態。
消費者均衡算法
當一個group中,有consumer加入或者離開時,會觸發partitions均衡.均衡的最終目的,是提升topic的并發消費能力。
- 將目標Topic下的所有Partirtion排序,存于PT
- 對于Consumer Group下所有Consumer排序,存于GC,第i個Consumer記為Ci
- N= size(PT)/size(GC),向上取整
- 解除Ci對原來分配的Partition的消費權(從0開始)
- 將第iN到(i+1)(N-1)Partition分配給Ci
實例:
- topic1,具有如下partitions: P0,P1,P2,P3
- 消費group中,有如下consumer: C0,C1
- 首先根據partition索引號對partitions排序: P0,P1,P2,P3
- 根據(consumer.id + '-'+ thread序號)排序: C0,C1
- 計算倍數: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整
- 然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]