怎麼理解 Kafka 消費者與消費組之間的關係?

與生產者對應的是消費者,應用程序可以通過 KafkaConsumer 來訂閱主題,並從訂閱的主題中拉取消息。不過在使用 KafkaConsumer 消費消息之前需要先了解消費者和消費組的概念,否則無法理解如何使用KafkaConsumer。

今天先講解消費者與消費組之間的關係,後續再結合案例再細緻地講解如何使用。

消費者負責訂閱 Kafka 中的主題(Topic),並且從訂閱的主題上拉取消息。與其他一些消息中間件不同的是:在 Kafka 的消費理念中還有一層消費組的概念,每個消費者都有一個對應的消費組。當消息發佈到主題後,只會被投遞給訂閱它的每個消費組中的一個消費者。



如上圖所示,某個主題中共有4個分區(Partition):P0、P1、P2、P3。有兩個消費組A和B都訂閱了這個主題,消費組A中有4個消費者(C0、C1、C2和C3),消費組B中有2個消費者(C4和C5)。按照 Kafka 默認的規則,最後的分配結果是消費組A中的每一個消費者分配到1個分區,消費組B中的每一個消費者分配到2個分區,兩個消費組之間互不影響。每個消費者只能消費所分配到的分區中的消息。換言之,每一個分區只能被一個消費組中的一個消費者所消費。



我們再來看一下消費組內的消費者個數變化時所對應的分區分配的演變。假設目前某消費組內只有一個消費者C0,訂閱了一個主題,這個主題包含7個分區:P0、P1、P2、P3、P4、P5、P6。也就是說,這個消費者C0訂閱了7個分區,具體分配情形參考上圖。

此時消費組內又加入了一個新的消費者C1,按照既定的邏輯,需要將原來消費者C0的部分分區分配給消費者C1消費,如上圖所示。消費者C0和C1各自負責消費所分配到的分區,彼此之間並無邏輯上的干擾。

消費者與消費組這種模型可以讓整體的消費能力具備橫向伸縮性,我們可以增加(或減少)消費者的個數來提高(或降低)整體的消費能力。對於分區數固定的情況,一味地增加消費者並不會讓消費能力一直得到提升,如果消費者過多,出現了消費者的個數大於分區個數的情況,就會有消費者分配不到任何分區。參考下圖,一共有8個消費者,7個分區,那麼最後的消費者C7由於分配不到任何分區而無法消費任何消息。

以上分配邏輯都是基於默認的分區分配策略進行分析的,可以通過消費者客戶端參數 partition.assignment.strategy 來設置消費者與訂閱主題之間的分區分配策略。

對於消息中間件而言,一般有兩種消息投遞模式:點對點(P2P,Point-to-Point)模式和發佈/訂閱(Pub/Sub)模式。點對點模式是基於隊列的,消息生產者發送消息到隊列,消息消費者從隊列中接收消息。

發佈訂閱模式定義瞭如何向一個內容節點發布和訂閱消息,這個內容節點稱爲主題(Topic),主題可以認爲是消息傳遞的中介,消息發佈者將消息發佈到某個主題,而消息訂閱者從主題中訂閱消息。主題使得消息的訂閱者和發佈者互相保持獨立,不需要進行接觸即可保證消息的傳遞,發佈/訂閱模式在消息的一對多廣播時採用。Kafka 同時支持兩種消息投遞模式,而這正是得益於消費者與消費組模型的契合:

  • 如果所有的消費者都隸屬於同一個消費組,那麼所有的消息都會被均衡地投遞給每一個消費者,即每條消息只會被一個消費者處理,這就相當於點對點模式的應用。

  • 如果所有的消費者都隸屬於不同的消費組,那麼所有的消息都會被廣播給所有的消費者,即每條消息會被所有的消費者處理,這就相當於發佈/訂閱模式的應用。

消費組是一個邏輯上的概念,它將旗下的消費者歸爲一類,每一個消費者只隸屬於一個消費組。每一個消費組都會有一個固定的名稱,消費者在進行消費前需要指定其所屬消費組的名稱,這個可以通過消費者客戶端參數 group.id 來配置,默認值爲空字符串。

消費者並非邏輯上的概念,它是實際的應用實例,它可以是一個線程,也可以是一個進程。同一個消費組內的消費者既可以部署在同一臺機器上,也可以部署在不同的機器上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章