kafka消费者组概念
https://blog.csdn.net/cgs666/article/details/85257819
應用程序使用 KafkaConsumer向 Kafka 訂閱主題,并從訂閱的主題上接收消息 。 從 Kafka 讀取數據不同于從其他悄息系統讀取數據,它涉及一些獨特的概念和想法。如果不先理解 這些概念,就難以理解如何使用消費者 API。所以我們接下來先解釋這些重要的概念,然 后再舉幾個例子,橫示如何使用消費者 API 實現不同的應用程序。
消費者和消費者群組
假設我們有一個應用程序需要從-個 Kafka主題讀取消息井驗證這些消息,然后再把它們 保存起來。應用程序需要創建一個消費者對象,訂閱主題并開始接收消息,然后驗證消息 井保存結果。過了 一陣子,生產者往主題寫入消息的速度超過了應用程序驗證數據的速 度,這個時候該怎么辦?如果只使用單個消費者處理消息,應用程序會遠跟不上消息生成 的速度。顯然,此時很有必要對消費者進行橫向伸縮。就像多個生產者可以向相同的 主題 寫入消息一樣,我們也可以使用多個消費者從同一個主題讀取消息,對消息進行分流。
Kafka 消費者從屬于消費者群組。一個群組里的消費者訂閱的是同一個主題,每個消費者 接收主題一部分分區的消息。
假設主題 T1 有 4 個分區,我們創建了消費者 C1 ,它是群組 G1 里唯 一 的消費者,我們用 它訂閱主題 T1。消費者 Cl1將收到主題 T1全部 4個分區的消息,如圖 4-1 所示。
如果在群組 G1 里新增一個消費者 C2,那么每個消費者將分別從兩個分區接收消息。我 假設消費者 C1接收分區 0 和分區 2 的消息,消費者 C2 接收分區 1 和分區 3 的消息,如圖 4-2 所示。
如果群組 G1 有 4 個消費者,那么每個消費者可以分配到 一個分區,如圖 4-3 所示。
如果我們往群組里添加更多的消費者,超過主題的分區數量,那么多出的消費者就會被閑置,不會接收到任何消息。
往群組里增加消費者是橫向伸縮消費能力的主要方式。 Kafka 消費者經常會做一些高延遲的操作,比如把數據寫到數據庫或 HDFS,或者使用數據進行比較耗時的計算。在這些情況下,單個消費者無法跟上數據生成的速度,所以可以增加更多的消費者,讓它們分擔負載,每個消費者只處理部分分區的消息,這就是橫向伸縮的主要手段。我們有必要為主題創建大量的分區,在負載增長時可以加入更多的消費者。不過要性意,不要讓消費者的數量超過主題分區的數量,多余的消費者只會被閑置。
除了通過增加消費者來橫向伸縮單個應用程序外,還經常出現多個應用程序從同一個主題讀取數據的情況。實際上, Kafka 設計的主要目標之一 ,就是要讓 Kafka 主題里的數據能夠滿足企業各種應用場景的需求。在這些場景里,每個應用程序可以獲取到所有的消息, 而不只是其中的 一部分。只要保證每個應用程序有自己的消費者群組,就可以讓它們獲取到主題所有的消息。不同于傳統的消息系統,橫向伸縮 Kafka消費者和消費者群組并不會對性能造成負面影響。
在上面的例子里,如果新增一個只包含一個消費者的群組 G2,那么這個消費者將從主題 T1 上接收所有的消息,與群組 G1 之間互不影響。群組 G2 可以增加更多的消費者,每個消費者可以消費若干個分區,就像群組 G1 那樣,如圖 4-5 所示。總的來說,群組 G2 還是會接收到所有消息,不管有沒有其他群組存在。
簡而言之,為每一個需要獲取一個或多個主題全部消息的應用程序創建一個消費者群組, 然后往群組里添加消費者來伸縮讀取能力和處理能力,群組里的每個消費者只處理一部分消息。
消費者群組和分區再均衡
我們已經從上一個小節了解到,群組里的消費者共同讀取主題的分區。一個新的消費者加 入群組時,它讀取的是原本由其他消費者讀取的消息。當一個消費者被關閉或發生崩潰時,它就離開群組,原本由它讀取的分區將由群組里的其他消費者來讀取。在主題發生變化時 , 比如管理員添加了新的分區,會發生分區重分配。
分區的所有權從一個消費者轉移到另一個消費者,這樣的行為被稱為再均衡。再均衡非常重要, 它為消費者群組帶來了高可用性和伸縮性(我們可以放心地添加或移除消費者), 不過在正常情況下,我們并不希望發生這樣的行為。在再均衡期間,消費者無法讀取消息,造成整個群組一小段時間的不可用。另外,當分區被重新分配給另 一個消費者時,消費者當前的讀取狀態會丟失,它有可能還需要去刷新緩存 ,在它重新恢復狀態之前會拖慢應用程序。我們將在本章討論如何進行安全的再均衡,以及如何避免不必要的再均衡。
消費者通過向被指派為 群組協調器的 broker (不同的群組可以有不同的協調器)發送 心跳 來維持它們和群組的從屬關系以及它們對分區的所有權關系。只要消費者以正常的時間間隔發送心跳,就被認為是活躍的,說明它還在讀取分區里的消息。消費者會在輪詢消息 (為了獲取消息)或提交偏移量時發送心跳。如果消費者停止發送心跳的時間足夠長,會話就會過期,群組協調器認為它已經死亡,就會觸發一次再均衡。
如果一個消費者發生崩潰,井停止讀取消息,群組協調器(broker)會等待幾秒鐘,確認它死亡了才會觸發再均衡。在這幾秒鐘時間里,死掉的消費者不會讀取分區里的消息。在清理消費者時,消費者會通知協調器它將要離開群組,協調器會立即觸發一次再均衡,盡量降低處理停頓。在本章的后續部分,我們將討論一些用于控制發送心跳頻率和會話過期時間的配置參數,以及如何根據實際需要來配置這些參數 。
分配分區是怎樣的一個過程
當消費者要加入群組時,它會向群組協調器發送 一 個 JoinGroup 請求。第 一 個加入群組的消費者將成為“群主”。群主從協調器那里獲得群組的成員列 表(列表中包含了所有最近發送過心跳的消費者,它們被認為是活躍的), 并負責給每一個消費者分配分區。它使用 一個實現了 PartitionAssignor接口的類來決定哪些分 區應該被分配給哪個消費者 。
Kafka 內置了兩種分配策略,在后面的配置參數小節我們將深入討論。分配完畢之后,群主把分配情況列表發送給群組協調器,協調器再把這些信息發送給所有消費者。每個消費者只能看到自己的分配信息,只有群 主知道群組 里所有消費者的分配信息。這個過程會在每次再均衡時重復發生。
https://blog.csdn.net/wobuaizhi/article/details/80950387
kafka分區(partition)和和分組(group)
2018年07月07日 12:37:37 現役碼農一個 閱讀數 6140
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wobuaizhi/article/details/80950387
下面是自己在使用過程中的總結。歡迎拍磚
每個consumer只能消費指定的幾個分區。那么消息如果沒有發到監聽的分區,那么那個消費者就不能獲取到這次發送的消息。
下面的例子一定要注意對分區和分組的理解,不然會不知道為什么會得出那樣的結論
消費組中的消費者會怎么取kafka的數據,看下方的介紹----來自網絡
1.其中 broker有兩個,也就是服務器有兩臺。
2.partition有6個,按照哈希取模的算法分配。
3.消費者有8個,他們屬于同一個消費組。
那么這一個消費組中的消費者會怎么取kafka的數據呢?
其實kafka的消費端有一個均衡算法,算法如下:
1.A=(partition數量/同分組消費者總個數)
2.M=對上面所得到的A值小數點第一位向上取整
3.計算出該消費者拉取數據的patition合集:Ci = [P(M*i ),P((i + 1) * M -1)]
A=6/8=0.75
M=1
C0=[P(1*0),P((0+1)1-1)]=[P0,P0]
同理:
C1=[P(11),P((1+1)1-1)]=[P1,P1]
C2=[P(12),P((2+1)1-1)]=[P2,P2]
C3=[P(13),P((3+1)1-1)]=[P3,P3]
C4=[P(14),P((4+1)1-1)]=[P4,P4]
C5=[P(15),P((5+1)1-1)]=[P5,P5]
C6=[P(16),P((6+1)1-1)]=[P6,P6]
C7=[P(17),P((7+1)*1-1)]=[P7,P7]
那么按照上面的算法:
C0消費者消費P0的數據
C1消費者消費P1的數據
C2消費者消費P2的數據
C3消費者消費P3的數據
C4消費者消費P4的數據
C5消費者消費P5的數據
C6消費者消費P6的數據
C7消費者消費P7的數據
但是partition只有P0-P5根本就沒有P6和P7,所以這兩個消費者相當于是會被閑置的,就相當于占用資源,卻沒什么用,所以在這里真正起到作用的就是C0-C5。
如果這個消費組里面的消費者少于partition數量呢(比如5個)?
那么還是依葫蘆畫瓢,根據上面的算法:
A=6/5=1.2
M=2
C0=[P(2*0),P((0+1)2-1)]=[P0,P1]
C1=[P(21),P((1+1)2-1)]=[P2,P3]
C2=[P(22),P((2+1)*2-1)]=[P4,P5]
C3=[P(2*3),P((3+1)2-1)]=[P6,P7]
C4=[P(24),P((4+1)*2-1)]=[P8,P9]
同上面一樣C3和C4沒有起到任何作用。
總結:
1.按照如上的算法,所以如果kafka的消費組需要增加組員,最多增加到和partition數量一致,超過的組員只會占用資源,而不起作用;
2.kafka的partition的個數一定要大于消費組組員的個數,并且partition的個數對于消費組組員取模一定要為0,不然有些消費者會占用資源卻不起作用;
3.如果需要增加消費組的組員個數,那么也需要根據上面的算法,調整partition的個數
通過上面的介紹可以知道。針對一個分組中分區和消費者實際是有對應關系的。不是說增加了分區,就一定可以增加并發。具體情況需要多多分析。
注意:消費組就是group.id不同。kafka中,同一個topic下,消息會給下面每一個group發送消息(如果有十個,那個這十個group都會接受到這個消息)。但是分區每個消息只有一個分區獲取。
總結
以上是生活随笔為你收集整理的kafka消费者组概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++下ctrl+z退出cin输入循环
- 下一篇: PBG部门培训