文章目錄
- 1. Kafka 消費者是什么?
- 2. Kafka 消費者組的概念?
- 3. Kafka 消費者和消費者組有什么關系?
- 4. Kafka 多個消費者如何同時消費一個分區?
1. Kafka 消費者是什么?
消費者負責訂閱Kafka中的主題,并且從訂閱的主題上拉取消息。與其他一些消息中間件不同的是:在Kafka的消費理念中還有一層消費組的概念,每個消費者都有一個對應的消費組。當消息發布到主題后,只會被投遞給訂閱它的每個消費組中的一個消費者。
2. Kafka 消費者組的概念?
假設我們有一個應用程序,它從一個Kafka主題讀取消息,在對這些消息做一些驗證后再把它們保存起來。應用程序需要創建一個消費者對象,訂閱主題并開始接收消息、驗證消息和保存結果。但過了一陣子,生產者向主題寫入消息的速度超過了應用程序驗證數據的速度,這時候該怎么辦呢?如果只使用單個消費者來處理消息,那么應用程序會遠遠跟不上消息生成的速度。顯然,此時很有必要對消費者進行橫向伸縮。就像多個生產者可以向相同的主題寫入消息一樣,也可以讓多個消費者從同一個主題讀取消息。
Kafka消費者從屬于消費者群組。一個群組里的消費者訂閱的是同一個主題,每個消費者負責讀取這個主題的部分消息。
① 假設主題T1有4個分區,我們創建了消費者C1,它是群組G1中唯一的消費者,用于訂閱主題T1。消費者C1將收到主題T1全部4個分區的消息。
② 如果在群組G1里新增一個消費者C2,那么每個消費者將接收到兩個分區的消息。假設消費者C1接收分區0和分區2的消息,消費者C2接收分區1和分區3的消息。
③ 如果群組G1有4個消費者,那么每個消費者將可以分配到一個分區。
④ 如果向群組里添加更多的消費者,以致超過了主題的分區數量,那么就會有一部分消費者處于空閑狀態,不會接收到任何消息。
向群組里添加消費者是橫向擴展數據處理能力的主要方式。Kafka消費者經常需要執行一些高延遲的操作,比如把數據寫到數據庫或用數據做一些比較耗時的計算。在這些情況下,單個消費者無法跟上數據生成的速度,因此可以增加更多的消費者來分擔負載,讓每個消費者只處理部分分區的消息,這是橫向擴展消費者的主要方式。于是,我們可以為主題創建大量的分區,當負載急劇增長時,可以加入更多的消費者。不過需要注意的是,不要讓消費者的數量超過主題分區的數量,因為多余的消費者只會被閑置。
⑤ 除了通過增加消費者數量來橫向伸縮單個應用程序,我們還經常遇到多個應用程序從同一個主題讀取數據的情況。實際上,Kafka的一個主要設計目標是讓Kafka主題里的數據能夠滿足企業各種應用場景的需求。在這些應用場景中,我們希望每一個應用程序都能獲取到所有的消息,而不只是其中的一部分。只要保證每個應用程序都有自己的消費者群組就可以讓它們獲取到所有的消息。不同于傳統的消息系統,橫向伸縮消費者和消費者群組并不會導致Kafka性能下降。
在之前的例子中,如果新增一個只包含一個消費者的群組G2,那么這個消費者將接收到主題T1的所有消息,與群組G1之間互不影響。群組G2可以增加更多的消費者,每個消費者會讀取若干個分區,就像群組G1里的消費者那樣。作為整體來說,群組G2還是會收到所有消息,不管有沒有其他群組存在。
總的來說,就是為每一個需要獲取主題全部消息的應用程序創建一個消費者群組,然后向群組里添加更多的消費者來擴展讀取能力和處理能力,讓群組里的每個消費者只處理一部分消息。
3. Kafka 消費者和消費者組有什么關系?
消費者組是一個邏輯上的概念,它將旗下的消費者歸為一類,每一個消費者只屬于一個消費者組。每一個消費組都會有一個固定的名稱,消費者在進行消費前需要指定其所屬消費者組的名稱,這個可以通過消費者客戶端參數group.id來配置,默認值為空字符串。 消費者組內每個消費者負責消費不同分區的數據,一個分區只能由同一個消費者組內的一個消費者來消費。
消費者組的作用是實現負載均衡和容錯性,因為每個消費者只能讀取主題中的一部分消息,而消費者組中的所有消費者共同讀取整個主題中的所有消息。
4. Kafka 多個消費者如何同時消費一個分區?
Kafka 中的每個分區只能被一個消費者消費,如果多個Kafka消費者要同時消費相同主題下相同分區的數據,需要將它們放到不同的消費者組中。在Kafka中,一個消費者組中的每個消費者會消費主題下不同分區的消息,而不同消費者組中的消費者則可以同時消費相同分區的數據。這樣可以實現多個消費者同時消費相同分區的數據,提高消費效率和可靠性。同時,Kafka還提供了一些負載均衡策略,可以根據消費者組中消費者的數量和消費能力來自動分配Partition,以實現更好的負載均衡。