Kafka中的消費者和分區(qū)再平衡

兩種常用的消息模型

隊列模型發(fā)布-訂閱模型

隊列模型:處理方式是一組消費者從服務(wù)器讀取消息,一條消息只由其中的一個消費者來處理。

發(fā)布-訂閱模型:消息被廣播給所有的消費者,接收到消息的消費者都可以處理此消息。

消費者和消費者組

消費者用一個消費者組名標(biāo)記自己。 一個發(fā)布在Topic上消息被分發(fā)給此消費者組中的一個消費者。 假如所有的消費者都在一個組中,那么這就變成了隊列模型。 假如所有的消費者都在不同的組中,那么就完全變成了發(fā)布-訂閱模型

消費者組是Kafka實現(xiàn)單播和廣播兩種消息模型的基礎(chǔ)和手段。對于同一個Topic來說,消費者接收數(shù)據(jù)的時候是按照消費者組來接收數(shù)據(jù)的,每個消費者組都可以拿到這個Topic中的全部數(shù)據(jù)。消費者組內(nèi)的所有消費者協(xié)調(diào)在一起來訂閱并消費Kafka Topic中的所有分區(qū)。Kafka確保每個分區(qū)的消息只能被同一個消費者組中的同一個消費者消費,如果想要重復(fù)消費,那么需要其他的消費者組來消費。

同一個消費者可以去消費多個分區(qū)中的數(shù)據(jù),但是每個分區(qū)只能由同一個消費者組內(nèi)的一個消費者來消費,當(dāng)消費者的數(shù)量大于了分區(qū)的數(shù)量時,多余的消費者將會處于空閑。也就是說如果只有一個分區(qū)的話,在同一個消費者組中啟動多少個消費者都沒有用。

所以說,同組中的消費者不能大于Topic中的分區(qū)數(shù)量。假如partition為4,訂閱改Topic的同組中的消費者最多只能為4個。

在不同情況下消費的分配

一個消費者訂閱一個主題進(jìn)行消費,Consumer1將消費Topic01中的所有partition的消息。

生產(chǎn)者向Topic01中發(fā)送消息: m1 m2 m3 m4 m5 m6 m7

Consumer1消費: m1 m2 m3 m4 m5 m6 m7

一個消費者訂閱一個主題進(jìn)行消費.png

多個消費者訂閱一個主題進(jìn)行消費,Consumer1將消費Topic01中的Partition0、Partition2的消息,Consumer2將消費Topic01中的Partition1、Partition3的消息。

往群組里增加消費者是橫向伸縮消費能力的主要方式。Kafka 消費者經(jīng)常會做一些高延遲的操作,比如把數(shù)據(jù)寫到數(shù)據(jù)庫或 HDFS,或者使用數(shù)據(jù)進(jìn)行比較耗時的計算。在這些情況下,單個消費者無法跟上數(shù)據(jù)生成的速度,所以可以增加更多的消費者,讓它們分擔(dān)負(fù)載,每個消費者只處理部分分區(qū)的消息,這就是橫向伸縮的主要手段。

生產(chǎn)者向Topic01中發(fā)送消息: m1 m2 m3 m4 m5 m6 m7

Consumer1消費:m1 m3 m5 m7

Consumer2消費:m2 m4 m6

多個消費者訂閱一個主題進(jìn)行消費.png

消費者數(shù)量大于訂閱的主題的分區(qū)數(shù)量,造成部分消費者處于空閑。

生產(chǎn)者向Topic01中發(fā)送消息: m1 m2 m3 m4 m5 m6 m7

Consumer1消費:m1 m5

Consumer2消費:m2 m6

Consumer3消費:m3 m7

Consumer4消費:m4

Consumer5消費:空閑,不會接收到任何消息

消費者數(shù)量大于訂閱的主題的分區(qū)數(shù)量.png

多個消費者組訂閱同一個Topic,多個消費者同時消費同一條消息

生產(chǎn)者向Topic01中發(fā)送消息: m1 m2 m3 m4 m5 m6 m7

ConsumerGroup01的Consumer1消費:m1 m3 m5 m7

ConsumerGroup01的Consumer2消費:m2 m4 m6

ConsumerGroup02的Consumer1消費:m1 m2 m3 m4 m5 m6 m7

多個消費者組訂閱同一個Topic.png
分配策略

Range:該策略會把主題的若干個連續(xù)的分區(qū)分配給消費者。

RoundRobin:該策略把主題的所有分區(qū)逐個分配給消費者。

消費者群組分區(qū)再均衡(Rebalance

什么是分區(qū)再均衡?

群組里的消費者共同讀取主題的分區(qū)。一個新的消費者加入群組時,它讀取的是原本由其他消費者讀取的消息。當(dāng)一個消費者被關(guān)閉或發(fā)生崩潰時,它就離開群組,原本由它讀取的分區(qū)將由群組里的其他消費者來讀取。在主題發(fā)生變化時,比如管理員添加了新的分區(qū),會發(fā)生分區(qū)重分配。

分區(qū)的所有權(quán)從一個消費者轉(zhuǎn)移到另一個消費者,這樣的行為被稱為再均衡 。再均衡非常重要,它為消費者群組帶來了高可用性和伸縮性(我們可以放心地添加或移除消費者),不過在正常情況下,我們并不希望發(fā)生這樣的行為。在再均衡期間,消費者無法讀取消息,造成整個群組一小段時間的不可用。另外,當(dāng)分區(qū)被重新分配給另一個消費者時,消費者當(dāng)前的讀取狀態(tài)會丟失,它有可能還需要去刷新緩存,在它重新恢復(fù)狀態(tài)之前會拖慢應(yīng)用程序。我們將在本章討論如何進(jìn)行安全的再均衡,以及如何避免不必要的再均衡。

再均衡的過程

消費者通過向被指派為群組協(xié)調(diào)器 的 broker(不同的群組可以有不同的協(xié)調(diào)器)發(fā)送心跳來維持它們和群組的從屬關(guān)系以及它們對分區(qū)的所有權(quán)關(guān)系。只要消費者以正常的時間間隔發(fā)送心跳,就被認(rèn)為是活躍的,說明它還在讀取分區(qū)里的消息。消費者會在輪詢消息(為了獲取消息)或提交偏移量時發(fā)送心跳。如果消費者停止發(fā)送心跳的時間足夠長,會話就會過期,群組協(xié)調(diào)器認(rèn)為它已經(jīng)死亡,就會觸發(fā)一次再均衡。

什么情況下會分區(qū)再均衡?
  1. Topic中添加一個新的分區(qū),消費者將重新分配。
  2. 消費者關(guān)閉或者崩潰,消費者讀取的分區(qū)將會分配給其他消費者。
  3. 消費者群組中添加新的消費者,將分區(qū)重新分配。
分區(qū)再均衡的優(yōu)缺點

優(yōu)點:實現(xiàn)高可用性和伸縮性

缺點:1. 再均衡的期間,群組不能讀取到消息。 2. partition被重新分配給一個消費者時,消費者當(dāng)前的讀取狀態(tài)會丟失,有可能還需要去刷新緩存,在它重新恢復(fù)狀態(tài)之前會拖慢應(yīng)用程序。

提交和偏移量

什么是提交?

消費者每次獲取到一條消息時, 它總是返回由生產(chǎn)者寫入 Kafka 但還沒有被消費者讀取過的記錄,我們因此可以追蹤到哪些記錄是被群組里的哪個消費者讀取的。消費者可以使用 Kafka 來追蹤消息在分區(qū)里的位置(偏移量)。這個更新分區(qū)當(dāng)前位置的操作叫作提交。

消費者是如何提交偏移量?

消費者往一個叫作 _consumer_offset 的特殊主題發(fā)送消息,消息里包含每個分區(qū)的偏移量。如果消費者一直處于運行狀態(tài),那么偏移量就沒有什么用處。不過,如果消費者發(fā)生崩潰或者有新的消費者加入群組,就會觸發(fā)再均衡 ,完成再均衡之后,每個消費者可能分配到新的分區(qū),而不是之前處理的那個。為了能夠繼續(xù)之前的工作,消費者需要讀取每個分區(qū)最后一次提交的偏移量,然后從偏移量指定的地方繼續(xù)處理。

提交偏移量產(chǎn)生的問題?
  1. 如果提交的偏移量小于客戶端處理的最后一個消息的偏移量,那么處于兩個偏移量之間的消息就會被重復(fù)處理。
  2. 如果提交的偏移量大于客戶端處理的最后一個消息的偏移量,那么處于兩個偏移量之間的消息將會丟失。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容