天天看點

怎麼了解 Kafka 消費者與消費組之間的關系?

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

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

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

怎麼了解 Kafka 消費者與消費組之間的關系?

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

怎麼了解 Kafka 消費者與消費組之間的關系?

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

怎麼了解 Kafka 消費者與消費組之間的關系?

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

怎麼了解 Kafka 消費者與消費組之間的關系?

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

怎麼了解 Kafka 消費者與消費組之間的關系?

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

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

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

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

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

消費組是一個邏輯上的概念,它将旗下的消費者歸為一類,每一個消費者隻隸屬于一個消費組。每一個消費組都會有一個固定的名稱,消費者在進行消費前需要指定其所屬消費組的名稱,這個可以通過消費者用戶端參數 group.id 來配置,預設值為空字元串。

消費者并非邏輯上的概念,它是實際的應用執行個體,它可以是一個線程,也可以是一個程序。同一個消費組内的消費者既可以部署在同一台機器上,也可以部署在不同的機器上。 

怎麼了解 Kafka 消費者與消費組之間的關系?