kafka工作原理介紹

兩張圖讀懂kafka應用:

image.png

image.png

1. Kafka 中的術語

  • broker:中間的kafka cluster,存儲消息,是由多個server組成的集群困乒。
  • topic:kafka給消息提供的分類方式迷捧。broker用來存儲不同topic的消息數(shù)據(jù)军拟。
  • producer:往broker中某個topic里面生產(chǎn)數(shù)據(jù)补鼻。
  • consumer:從broker中某個topic獲取數(shù)據(jù)相叁。

2. 詳細說明

Broker
中間的kafka cluster,存儲消息辽幌,是由多個server組成的集群。

image.png

topic與消息
kafka將所有消息組織成多個topic的形式存儲椿访,而每個topic又可以拆分成多個partition乌企,每個partition又由一個一個消息組成。每個消息都被標識了一個遞增序列號代表其進來的先后順序成玫,并按順序存儲在partition中加酵。

image.png

這樣,消息就以一個個id的方式哭当,組織起來猪腕。

  • producer選擇一個topic,生產(chǎn)消息钦勘,消息會通過分配策略append到某個partition末尾陋葡。

  • consumer選擇一個topic,通過id指定從哪個位置開始消費消息彻采。消費完成之后保留id腐缤,下次可以從這個位置開始繼續(xù)消費捌归,也可以從其他任意位置開始消費。
    上面的id在kafka中稱為offset岭粤,這種組織和處理策略提供了如下好處:

  • 消費者可以根據(jù)需求惜索,靈活指定offset消費。

  • 保證了消息不變性剃浇,為并發(fā)消費提供了線程安全的保證巾兆。每個
    consumer都保留自己的offset,互相之間不干擾虎囚,不存在線程安全問題角塑。

  • 消息訪問的并行高效性。每個topic中的消息被組織成多個partition溜宽,partition均勻分配到集群server中吉拳。生產(chǎn)、消費消息的時候适揉,會被路由到指定partition留攒,減少競爭,增加了程序的并行能力嫉嘀。

  • 增加消息系統(tǒng)的可伸縮性炼邀。每個topic中保留的消息可能非常龐大,通過partition將消息切分成多個子消息剪侮,并通過負責均衡策略將partition分配到不同server拭宁。這樣當機器負載滿的時候,通過擴容可以將消息重新均勻分配瓣俯。

  • 保證消息可靠性杰标。消息消費完成之后不會刪除,可以通過重置offset重新消費彩匕,保證了消息不會丟失腔剂。

  • 靈活的持久化策略⊥找牵可以通過指定時間段(如最近一天)來保存消息掸犬,節(jié)省broker存儲空間。

  • 備份高可用性绪爸。消息以partition為單位分配到多個server湾碎,并以partition為單位進行備份。備份策略為:1個leader和N個followers奠货,leader接受讀寫請求介褥,followers被動復制leader。leader和followers會在集群中打散,保證partition高可用呻顽。

Partitions
每個Topics劃分為一個或者多個Partition,并且Partition中的每條消息都被標記了一個sequential id ,也就是offset,并且存儲的數(shù)據(jù)是可配置存儲時間的

producer

  • producer生產(chǎn)消息需要如下參數(shù):
  • topic:往哪個topic生產(chǎn)消息雹顺。
  • partition:往哪個partition生產(chǎn)消息。
  • key:根據(jù)該key將消息分區(qū)到不同partition廊遍。
  • message:消息嬉愧。


    image.png

consumer
傳統(tǒng)消息系統(tǒng)有兩種模式:

  • 隊列
  • 發(fā)布訂閱

kafka通過consumer group將兩種模式統(tǒng)一處理:每個consumer將自己標記consumer group名稱,之后系統(tǒng)會將consumer group按名稱分組喉前,將消息復制并分發(fā)給所有分組没酣,每個分組只有一個consumer能消費這條消息。如下圖:


image.png

于是推理出兩個極端情況:

  • 當所有consumer的consumer group相同時卵迂,系統(tǒng)變成隊列模式
  • 當每個consumer的consumer group都不相同時裕便,系統(tǒng)變成發(fā)布訂閱

注意

  • Consumer Groups 提供了topics和partitions的隔離, 如上圖Consumer Group A中的consumer-C2掛掉见咒,consumer-C1會接收P1,P2偿衰,即一個consumer Group中有其他consumer掛掉后能夠重新平衡。如下圖:

  • 多consumer并發(fā)消費消息時改览,容易導致消息亂序下翎,通過限制消費者為同步,可以保證消息有序宝当,但是這大大降低了程序的并發(fā)性视事。

kafka通過partition的概念,保證了partition內(nèi)消息有序性庆揩,緩解了上面的問題俐东。partition內(nèi)消息會復制分發(fā)給所有分組,每個分組只有一個consumer能消費這條消息订晌。這個語義保證了某個分組消費某個分區(qū)的消息虏辫,是同步而非并發(fā)的。如果一個topic只有一個partition锈拨,那么這個topic并發(fā)消費有序乒裆,否則只是單個partition有序。

一般消息系統(tǒng)推励,consumer存在兩種消費模型:

  • push:優(yōu)勢在于消息實時性高。劣勢在于沒有考慮consumer消費能力和飽和情況肉迫,容易導致producer壓垮consumer验辞。
  • pull:優(yōu)勢在可以控制消費速度和消費數(shù)量,保證consumer不會出現(xiàn)飽和喊衫。劣勢在于當沒有數(shù)據(jù)跌造,會出現(xiàn)空輪詢,消耗cpu。

kafka采用pull壳贪,并采用可配置化參數(shù)保證當存在數(shù)據(jù)并且數(shù)據(jù)量達到一定量的時候陵珍,consumer端才進行pull操作,否則一直處于block狀態(tài)违施。kakfa采用整數(shù)值consumer position來記錄單個分區(qū)的消費狀態(tài)互纯,并且單個分區(qū)單個消息只能被consumer group內(nèi)的一個consumer消費,維護簡單開銷小磕蒲。消費完成留潦,broker收到確認,position指向下次消費的offset辣往。由于消息不會刪除兔院,在完成消費,position更新之后站削,consumer依然可以重置offset重新消費歷史消息坊萝。

消息發(fā)送語義
producer視角

  • 消息最多發(fā)送一次:producer異步發(fā)送消息,或者同步發(fā)消息但重試次數(shù)為0许起。
  • 消息至少發(fā)送一次:producer同步發(fā)送消息十偶,失敗、超時都會重試街氢。
  • 消息發(fā)且僅發(fā)一次:后續(xù)版本支持扯键。

consumer視角

  • 消息最多消費一次:consumer先讀取消息,再確認position珊肃,最后處理消息荣刑。
  • 消息至少消費一次:consumer先讀取消息,再處理消息伦乔,最后確認position厉亏。
  • 消息消費且僅消費一次。

注意:

  • 如果消息處理后的輸出端(如db)能保證消息更新冪等性烈和,則多次消費也能保證exactly once語義爱只。
  • 如果輸出端能支持兩階段提交協(xié)議,則能保證確認position和處理輸出消息同時成功或者同時失敗招刹。
  • 在消息處理的輸出端存儲更新后的position恬试,保證了確認position和處理輸出消息的原子性(簡單、通用)疯暑。

可用性
在kafka中训柴,正常情況下所有node處于同步中狀態(tài),當某個node處于非同步中狀態(tài)妇拯,也就意味著整個系統(tǒng)出問題幻馁,需要做容錯處理洗鸵。

同步中代表了:

  • 該node與zookeeper能連通。
  • 該node如果是follower仗嗦,那么consumer position與leader不能差距太大(差額可配置)膘滨。

某個分區(qū)內(nèi)同步中的node組成一個集合,即該分區(qū)的ISR稀拐。

kafka通過兩個手段容錯:

  • 數(shù)據(jù)備份:以partition為單位備份火邓,副本數(shù)可設置。當副本數(shù)為N時钩蚊,代表1個leader贡翘,N-1個followers,followers可以視為leader的consumer砰逻,拉取leader的消息鸣驱,append到自己的系統(tǒng)中

failover:

  • 當leader處于非同步中時,系統(tǒng)從followers中選舉新leader

  • 當某個follower狀態(tài)變?yōu)榉峭街袝r蝠咆,leader會將此follower剔除ISR踊东,當此follower恢復并完成數(shù)據(jù)同步之后再次進入 ISR。

另外刚操,kafka有個保障:當producer生產(chǎn)消息時闸翅,只有當消息被所有ISR確認時,才表示該消息提交成功菊霜。只有提交成功的消息坚冀,才能被consumer消費。

因此鉴逞,當有N個副本時记某,N個副本都在ISR中,N-1個副本都出現(xiàn)異常時构捡,系統(tǒng)依然能提供服務液南。

假設N副本全掛了,node恢復后會面臨同步數(shù)據(jù)的過程勾徽,這期間ISR中沒有node滑凉,會導致該分區(qū)服務不可用。kafka采用一種降級措施來處理:選舉第一個恢復的node作為leader提供服務喘帚,以它的數(shù)據(jù)為基準畅姊,這個措施被稱為臟leader選舉。由于leader是主要提供服務的吹由,kafka broker將多個partition的leader均分在不同的server上以均攤風險涡匀。每個parition都有l(wèi)eader,如果在每個partition內(nèi)運行選主進程溉知,那么會導致產(chǎn)生非常多選主進程。kakfa采用一種輕量級的方式:從broker集群中選出一個作為controller,這個controller監(jiān)控掛掉的broker级乍,為上面的分區(qū)批量選主舌劳。

一致性
上面的方案保證了數(shù)據(jù)高可用,有時高可用是體現(xiàn)在對一致性的犧牲上玫荣。如果希望達到強一致性甚淡,可以采取如下措施:

  • 禁用臟leader選舉,ISR沒有node時捅厂,寧可不提供服務也不要未完全同步的node贯卦。
  • 設置最小ISR數(shù)量min_isr,保證消息至少要被min_isr個node確認才能提交焙贷。

持久化
基于以下幾點事實撵割,kafka重度依賴磁盤而非內(nèi)存來存儲消息。

  • 硬盤便宜辙芍,內(nèi)存貴
  • 順序讀+預讀取操作啡彬,能提高緩存命中率
  • 操作系統(tǒng)利用富余的內(nèi)存作為pagecache,配合預讀取(read-ahead)+寫回(write-back)技術故硅,從cache讀數(shù)據(jù)庶灿,寫到cache就返回(操作系統(tǒng)后臺flush),提高用戶進程響應速度
  • java對象實際大小比理想大小要大吃衅,使得將消息存到內(nèi)存成本很高
  • 當堆內(nèi)存占用不斷增加時往踢,gc抖動較大
  • 基于文件順序讀寫的設計思路,代碼編寫簡單
  • 在持久化數(shù)據(jù)結(jié)構(gòu)的選擇上徘层,kafka采用了queue而不是Btree
  • kafka只有簡單的根據(jù)offset讀和append操作峻呕,所以基于queue操作的時間復雜度為O(1),而基于Btree操作的時間復雜度為O(logN)
  • 在大量文件讀寫的時候,基于queue的read和append只需要一次磁盤尋址惑灵,而Btree則會涉及多次山上。磁盤尋址過程極大降低了讀寫性能

2. 參考文檔

kafka官方文檔
Kafka全解析
小白也能看懂的簡單明了kafka原理解析

3.原文鏈接

原文:https://blog.csdn.net/qq_29186199/article/details/80827085

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市英支,隨后出現(xiàn)的幾起案子佩憾,更是在濱河造成了極大的恐慌,老刑警劉巖干花,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妄帘,死亡現(xiàn)場離奇詭異,居然都是意外死亡池凄,警方通過查閱死者的電腦和手機抡驼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肿仑,“玉大人致盟,你說我怎么就攤上這事碎税。” “怎么了馏锡?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵雷蹂,是天一觀的道長。 經(jīng)常有香客問我杯道,道長匪煌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任党巾,我火速辦了婚禮萎庭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘齿拂。我一直安慰自己驳规,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布创肥。 她就那樣靜靜地躺著达舒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叹侄。 梳的紋絲不亂的頭發(fā)上巩搏,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音趾代,去河邊找鬼贯底。 笑死,一個胖子當著我的面吹牛撒强,可吹牛的內(nèi)容都是我干的禽捆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼飘哨,長吁一口氣:“原來是場噩夢啊……” “哼胚想!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芽隆,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浊服,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胚吁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牙躺,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年腕扶,在試婚紗的時候發(fā)現(xiàn)自己被綠了孽拷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡半抱,死狀恐怖脓恕,靈堂內(nèi)的尸體忽然破棺而出膜宋,到底是詐尸還是另有隱情,我是刑警寧澤炼幔,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布激蹲,位于F島的核電站,受9級特大地震影響江掩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乘瓤,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一环形、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衙傀,春花似錦抬吟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聪建,卻和暖如春钙畔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背金麸。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工擎析, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挥下。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓揍魂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棚瘟。 傳聞我的和親對象是個殘疾皇子现斋,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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

  • 背景介紹 Kafka簡介 Kafka是一種分布式的,基于發(fā)布/訂閱的消息系統(tǒng)偎蘸。主要設計目標如下: 以時間復雜度為O...
    高廣超閱讀 12,843評論 8 167
  • 目標 高吞吐量來支持高容量的事件流處理 支持從離線系統(tǒng)加載數(shù)據(jù) 低延遲的消息系統(tǒng) 持久化 依賴文件系統(tǒng)庄蹋,持久化到本...
    jiangmo閱讀 1,291評論 0 4
  • kafka數(shù)據(jù)可靠性深度解讀 Kafka起初是由LinkedIn公司開發(fā)的一個分布式的消息系統(tǒng),后成為Apache...
    it_zzy閱讀 2,010評論 2 20
  • 1. 概述 Kakfa起初是由LinkedIn公司開發(fā)的一個分布式的消息系統(tǒng)禀苦,后成為Apache的一部分蔓肯,它使用S...
    尼小摩閱讀 1,442評論 0 17
  • Kafka系列一- Kafka背景及架構(gòu)介紹 Kafka簡介 Kafka是一種分布式的,基于發(fā)布/訂閱的消息系統(tǒng)振乏。...
    raincoffee閱讀 2,211評論 0 22