與生產者對應的是消費者,應用程式可以通過 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 來配置,默認值為空字串,
消費者并非邏輯上的概念,它是實際的應用實體,它可以是一個執行緒,也可以是一個行程,同一個消費組內的消費者既可以部署在同一臺機器上,也可以部署在不同的機器上,

CSDN認證博客專家
軟體架構師
B站網紅UP
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254517.html
標籤:其他
