Kafka consumer 解析

上一篇說了Kafka consumer的處理邏輯脓恕、實現(xiàn)原理及相關(guān)的特點,本篇來看看Kafka 另一個client Consumer葵腹,作為生產(chǎn)者消費者的另一端垮庐,consumer提供了消費消息的能力,下面來看看Kafka中的consumer 應(yīng)該如何正確使用及實現(xiàn)原理首繁。

發(fā)布訂閱&生產(chǎn)者消費者模式

常見的消息引擎中通常有 經(jīng)典的生產(chǎn)者消費者模式作郭、發(fā)布訂閱模式 兩種

生產(chǎn)者 消費者模式

是一種點對點的方式,消息不會被重復消費弦疮,可以粗暴的理解為消息被消費后就被標記刪除或者已刪除了夹攒,這是常見的消息隊列通常的模式。比如說進程間通信胁塞,這種基于隊列實現(xiàn)消息傳輸服務(wù)的咏尝。

發(fā)布訂閱

相對于生產(chǎn)者 消費者模式,消息可能會被多方消費啸罢,可以簡單的理解為一份報紙的內(nèi)容编检,訂閱它的人都可以讀到它,當一個人讀完之后也就沒必要再次去讀了扰才。并且在發(fā)布訂閱模式中允懂,通常有個概念叫做topic,每個topic 有對應(yīng)的發(fā)布者(publisher)衩匣、訂閱者(subsciber)蕾总。

那Kafka是如何實現(xiàn)生產(chǎn)者消費者兩種模式的呢?往后看~

消費者 & 消費者組

kafka中有一個概念叫做consumer group琅捏,每個group 去訂閱對應(yīng)的topic生百,topic的每條消息只能發(fā)送到訂閱它的消費者組的其中一個實例上,并且每個消費者至多使用一個消費者組來標示自己午绳。這樣不難得出置侍,當某個topic 僅有一個group來消費時(組內(nèi)有一個或者多個consumer),這個topic的消息的消費模式就是典型的生產(chǎn)者消費者模式。

image.png

而當某個topic 被多個消費者組訂閱蜡坊,而每個組僅有一個消費者時杠输,每條消息就會被廣播到每個消費者上。

image.png

這里需要注意下秕衙,還有個叫做獨立消費者(standalone consumer)的概念蠢甲,對于consumer group 是以group 為單位進行消息消費的,而standalone 會單獨的執(zhí)行消費据忘,以consumer 實例為單位進行消費的鹦牛。

group 狀態(tài)機 & group管理協(xié)議

是時候來看看Kafka consumer 端的實現(xiàn)原理了,先從最基礎(chǔ)的group 開始勇吊,當前較新版本的consumer是依賴于broker端的coordinator來完成組的管理的(主要是把分配方案通知到每個consumer實例上)曼追,當然了這里涉及一個一致性策略,當無法達成這個策略是汉规,就直接拋異常請求人工介入處理了礼殊。

coordinator 實現(xiàn)組的管理,依賴的主要是consumer group的狀態(tài)针史,僅有 Empty(組內(nèi)沒有任何active consumer)晶伦、PreparingRebalance(group 正在準備進行rebalance)、AwaitingSync(所有組員已經(jīng)加入組并等待leader consumer發(fā)送分區(qū)的分配方案)啄枕、Stable(group開始正常消費)婚陪、Dead(該group 已經(jīng)被廢棄)這五個狀態(tài),那他們是如何輪轉(zhuǎn)的可以簡單的看一下狀態(tài)機频祝。

image.png

就整個過程來說泌参,可以大致分為加入組階段、狀態(tài)同步階段智润。

加入組階段:當明確group的coordinator之后及舍,組內(nèi)成員需要顯式的發(fā)送JoinGroup請求(主要包括 訂閱信息未辆、成員id等元數(shù)據(jù)信息)給對應(yīng)的coordinator窟绷,然后coordinator選擇對應(yīng)的consumer 作為leader,然后再給其他成員產(chǎn)生響應(yīng)(一個空數(shù)組)咐柜。當然啦兼蜈,如果某個consumer 指定的分配策略是其他consumer 不支持的,那么這個實例是不被接受的∽居眩現(xiàn)有的分區(qū)策略主要有:range为狸、round-robin、sticky遗契,其中sticky是其中可以最大限度保證分區(qū)的負載的均衡分配機rebalance之后的最少分配變動辐棒。

offset & broker 中的offset

offset 概念這里需要單獨抽出來說一下,因為在Kafka 里面存在兩個offset的概念,一個指的是consumer 中的offset漾根,一個是broker中的offset

concumer offset 用來記錄當前消費了多少條消息泰涂,這個offset的狀態(tài)是由consumer group來維護的,通過檢查點機制對于offset的值進行持久化(內(nèi)部就是一個map)

broker offset 消息在broker 端的位移值辐怕,根據(jù)之前說過的幾個概念可以大致的理解為一個<topic逼蒙,partition,offset>可以唯一的標示到一條消息寄疏。

_consumer_offset topic & zookeeper 位移管理

因為新版本和舊版本Kafka 所采用的offset保存策略是不同的是牢,舊版本中主要依賴于Zookeeper,但是zookeeper不是干這事兒的啊陕截,所以kafka 在數(shù)量很大的消費發(fā)生時驳棱,zookeeper讀寫會異常的頻繁,導致很容易成為整個Kafka系統(tǒng)的瓶頸农曲。所以新版本對這種方式作出了重大更新蹈胡,不再依賴于Zookeeper 來進行狀態(tài)的保存,而是在broker 端直接開一個內(nèi)部使用的topic朋蔫,也就是_consumer_offsets topic罚渐,并且kafka 為了兼容老版本的consumer 還提供了 offsets.storage=kafka這樣一個適配參數(shù)。

Rebalance & 場景剖析

最后要說的一點就是consumer 端的Rebalance 過程(rebalance是針對consumer group來說的驯妄,如果是standalone consumer 則沒有這個概念)荷并,rebalance也就是如何達成一致來分配訂閱topic的所有分區(qū)。這個rebalance的代價還是不小的青扔,我們是需要避免高頻的rebalance的源织。常見的rebalance 場景有:新成員加入組、組內(nèi)成員崩潰(這種場景無法主動通知微猖,需要被動的檢測才行谈息,并且需要一個session.timeout 才檢測到)、成員主動離組凛剥。

consumer 是可以執(zhí)行任意次rebalance的侠仇,為了區(qū)分兩次rebalance上的數(shù)據(jù)(防止無效或者延遲的offset提交),consumer 設(shè)計了一個叫做rebalance generation的標示犁珠。

對應(yīng)常見的rebalance請求有:

JoinGroup:consumer 請求加入組

SyncGroup:group leader把分配方案同步給組內(nèi)所有成員

Heartbeat:consumer 定期向coordination匯報心跳表示自己還存活

LeaveGroup:consumer 主動通知coordinator該consumer即將離組

DescribeGroup:查看組的所有信息逻炊。

Consumer端常見的概念大致就這么多。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犁享,一起剝皮案震驚了整個濱河市余素,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炊昆,老刑警劉巖桨吊,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件威根,死亡現(xiàn)場離奇詭異,居然都是意外死亡视乐,警方通過查閱死者的電腦和手機医窿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炊林,“玉大人姥卢,你說我怎么就攤上這事≡郏” “怎么了独榴?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奕枝。 經(jīng)常有香客問我棺榔,道長,這世上最難降的妖魔是什么隘道? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任症歇,我火速辦了婚禮,結(jié)果婚禮上谭梗,老公的妹妹穿的比我還像新娘忘晤。我一直安慰自己,他們只是感情好激捏,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布设塔。 她就那樣靜靜地躺著,像睡著了一般远舅。 火紅的嫁衣襯著肌膚如雪闰蛔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天图柏,我揣著相機與錄音序六,去河邊找鬼。 笑死蚤吹,一個胖子當著我的面吹牛例诀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播距辆,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼余佃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跨算?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤椭懊,失蹤者是張志新(化名)和其女友劉穎诸蚕,沒想到半個月后步势,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡背犯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年坏瘩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漠魏。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡倔矾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柱锹,到底是詐尸還是另有隱情哪自,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布禁熏,位于F島的核電站壤巷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞧毙。R本人自食惡果不足惜胧华,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宙彪。 院中可真熱鬧矩动,春花似錦、人聲如沸释漆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灵汪。三九已至檀训,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間享言,已是汗流浹背峻凫。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留览露,地道東北人荧琼。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像差牛,于是被迫代替她去往敵國和親命锄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容