kafka的消費(fèi)者

消費(fèi)組和消費(fèi)者概念
24154608_yl1d.jpg.png
  • 每個consumer客戶端被創(chuàng)建時,會向zookeeper注冊自己的信息;
  • 同一個Consumer Group中的Consumers,Kafka將相應(yīng)Topic中的每個消息只發(fā)送給其中一個Consumer。
  • Consumer Group中的每個Consumer讀取Topic的一個或多個Partitions,并且是唯一的Consumer;
  • 一個Consumer group的多個consumer的所有線程依次有序地消費(fèi)一個topic的所有partitions,如果Consumer group中所有consumer總線程大于partitions數(shù)量,則會出現(xiàn)空閑情況;

舉例:

  • kafka集群中創(chuàng)建一個topic為report-log 4 partitions 索引編號為0,1,2,3, 假如有目前有三個消費(fèi)者node。
  • 如果每個consumer創(chuàng)建一個consumer thread線程,各個node消費(fèi)情況如下,node1消費(fèi)索引編號為0,1分區(qū),node2費(fèi)索引編號為2,node3費(fèi)索引編號為3。
  • 如果每個consumer創(chuàng)建2個consumer thread線程,各個node消費(fèi)情況如下(是從consumer node先后啟動狀態(tài)來確定的),node1消費(fèi)索引編號為0,1分區(qū);node2費(fèi)索引編號為2,3;node3為空閑狀態(tài)。
    總結(jié):從以上可知,Consumer Group中各個consumer是根據(jù)先后啟動的順序有序消費(fèi)一個topic的所有partitions的。
    如果Consumer Group中所有consumer的總線程數(shù)大于partitions數(shù)量,則可能consumer thread或consumer會出現(xiàn)空閑狀態(tài)。
消費(fèi)者均衡算法

當(dāng)一個group中,有consumer加入或者離開時,會觸發(fā)partitions均衡.均衡的最終目的,是提升topic的并發(fā)消費(fèi)能力。

  • 將目標(biāo)Topic下的所有Partirtion排序,存于PT
  • 對于Consumer Group下所有Consumer排序,存于GC,第i個Consumer記為Ci
  • N= size(PT)/size(GC),向上取整
  • 解除Ci對原來分配的Partition的消費(fèi)權(quán)(從0開始)
  • 將第iN到(i+1)(N-1)Partition分配給Ci

實(shí)例:

  1. topic1,具有如下partitions: P0,P1,P2,P3
  2. 消費(fèi)group中,有如下consumer: C0,C1
  3. 首先根據(jù)partition索引號對partitions排序: P0,P1,P2,P3
  4. 根據(jù)(consumer.id + '-'+ thread序號)排序: C0,C1
  5. 計算倍數(shù): M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整
  6. 然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容