老吳的學(xué)習(xí)筆記-kafka

  • 聽說kafka是個(gè)神器筛武。好想學(xué)!


kafka是啥盗胀?

  • 分布式消息隊(duì)列
  • 排隊(duì)用的。
  • 在分布式系統(tǒng)中淡溯,消息隊(duì)列(message queue)是實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式的利器读整!
  • 生產(chǎn)者(producer)把只管把生產(chǎn)好的消息無腦往隊(duì)列里放,快慢都可以跟著感覺走咱娶。隨放隨走米间,不粘人。
  • 消費(fèi)者(consumer)有需求了就只管從隊(duì)列里取膘侮,取多取少請你隨意屈糊。
  • 市場不景氣供大于求,生產(chǎn)者依然可以隨意生產(chǎn)琼了,消息隊(duì)列hold得住逻锐。
  • 消費(fèi)者信心恢復(fù)的時(shí)候夫晌,它來會來處理陳年舊貨。
  • 我盜一張圖給你看:


    http://kafka.apache.org

全世界的消息隊(duì)列都死光了嗎昧诱,偏偏要學(xué)kafka晓淀?

  • 此言差矣。我中意kafka是因?yàn)椋?/li>
  • 吞吐量高的嚇人
  • 可靠性高的要命

我懂的不多盏档,你不我騙我凶掰。要保證可靠性,消息都是要存儲在硬盤上的蜈亩,就硬盤那點(diǎn)速度懦窘,怎么可能吞吐量高?

  • 硬盤速度不快稚配,因?yàn)闀r(shí)間都浪費(fèi)在磁盤尋道上了畅涂!東寫一下,西寫一下道川,磁頭在磁盤上疲于奔命午衰,根本沒有多少時(shí)間是用在寫入上的。

既然這樣愤惰,我讓磁頭不要?jiǎng)觼韯?dòng)去苇经,待在一個(gè)地方死命寫不就完了?我好機(jī)智宦言。話說這樣以后卵用是否明顯扇单?

  • 據(jù)kafka官網(wǎng)吹,如果隨機(jī)寫入磁盤奠旺,速度就只有100KB每秒蜘澜。順序?qū)懭氲脑挘?200轉(zhuǎn)/s的磁盤就能達(dá)到驚人的600MB每秒!

然后呢响疚?

  • 然后他們就決定直接往磁盤里寫鄙信,不緩存了!

太草率了吧忿晕?装诡!

  • 是真的!因?yàn)樗麄儼l(fā)現(xiàn)操作系統(tǒng)對文件訪問做了優(yōu)化践盼,文件會在內(nèi)核空間分頁做緩存(pageCache)鸦采。寫入時(shí)先寫入pageCache。由操作系統(tǒng)來決定何時(shí)統(tǒng)一寫入磁盤咕幻。操作系統(tǒng)很雞賊地使用順序?qū)懭胗娌俣雀芨艿模∠胂肟纯匆蕹蹋棵?00MB锣吼,折合為帶寬就是4.8G 选浑!千兆以網(wǎng)的速度也不過如此啊。

如此來看玄叠,kafka對數(shù)據(jù)的“吞”入速度確實(shí)不錯(cuò)古徒。不過我很好奇,如果我們服務(wù)器的硬盤很爛读恃,又或者帶寬不高描函,一臺機(jī)器處理不過來,kafka如何擴(kuò)展狐粱?

  • 分而治之。不同業(yè)務(wù)的消息用topic區(qū)分開來胆数。一個(gè)topic的消息可以發(fā)到多個(gè)partition(隊(duì)列分組)肌蜻。這些partition部署在不同的機(jī)器上。producer在投遞一個(gè)消息之前必尼,可以自由選擇要投遞到哪個(gè)partition. 選擇方法就很多啦蒋搜,你可以輪流著來(round robin),也可以逮著一個(gè)天天來判莉,還可以根據(jù)消息的特征來豆挽。性能不夠,加機(jī)器券盅,加partition啦帮哈。

吞吐量,量只是一個(gè)方面锰镀。我想知道kafka在量上是如何保證的娘侍?

  • 說來話長。我長話短說:通過pull模式消費(fèi)消息泳炉。

能否說細(xì)一點(diǎn)憾筏?

  • 是這樣的,同一個(gè)topic的消息花鹅,可能會有多個(gè)業(yè)務(wù)集群都很感興趣氧腰。每個(gè)集群都希望得到這份消息。而同一個(gè)集群內(nèi)部絕大部分情況下只需要消費(fèi)此消息一次刨肃。
  • 如果采用push的模式古拴,需要消息隊(duì)列將每個(gè)消息廣播到所有集群中。并且只從每個(gè)集群中選擇一臺機(jī)器來接收此消息之景。
  • 如果每個(gè)集群消費(fèi)的速度不同斤富,那么消費(fèi)的進(jìn)度也不同。需要消息隊(duì)列來跟蹤每個(gè)集群的消費(fèi)進(jìn)度和消費(fèi)速度锻狗,以決定是否push下一條消息满力。
  • 如果采用pull的模式焕参,能否消費(fèi)下一條消息完全由消費(fèi)者決定。消息隊(duì)列只需要被動(dòng)地記錄每個(gè)集群的消費(fèi)進(jìn)度即可油额。
  • 在這基礎(chǔ)上叠纷,消費(fèi)者根據(jù)自身能力一次拉取多個(gè)消息并采用壓縮的格式傳輸就很自然啦。

我明白了潦嘶。采用pull的方式消費(fèi)涩嚣,那么消費(fèi)者之間不會因?yàn)橄M(fèi)速度不一致而互相干擾。消費(fèi)最快的消費(fèi)者的速度不會受到任何約束掂僵。因此航厚,kafka 對消息的量也就達(dá)到了極致。

說到消費(fèi)模式锰蓬,我想知道消費(fèi)者是如何消費(fèi)的幔睬?

  • 消費(fèi)者會自主選擇從哪個(gè)partition消費(fèi)。partition內(nèi)的消息是按生產(chǎn)順序排列的芹扭。如果需要消費(fèi)時(shí)消息的順序不能亂麻顶,需要固定在一個(gè)partition消費(fèi)。

說了老半天舱卡,最重要的問題給忘了辅肾。kafka中的producer、customer轮锥、partition是如何發(fā)現(xiàn)彼此的呢矫钓?producer怎么知道消息投遞到哪些partition?consumer又是如何知道從哪些partition獲取消息舍杜?

  • 當(dāng)然是集群組織利器:ZooKeeper份汗! 集群中的各參與者將自己注冊到ZooKeeper中,從ZooKeeper中發(fā)現(xiàn)彼此蝴簇。詳情請參見:老吳的學(xué)習(xí)筆記-Zookeeper

氨睢!~~不行了熬词,我感到自己的知識快要溢出了旁钧!

少年且慢,還有一事相問互拾。剛才只說了吞吐量歪今,來說說可靠性吧!

  • 可靠交付包括三個(gè)部分:從producer交付到parition的可靠性,在partition內(nèi)部的可靠性,從partition到consumer的可靠性。
  • 接下的精華部分你可要認(rèn)真聽了颜矿。

請說重點(diǎn)寄猩。producer到partition怎么個(gè)可靠法?

  • 是這樣的骑疆,消息在producer內(nèi)部田篇,因?yàn)閜roducer自己失敗而丟失這種事情替废,kafka并不管。
  • 在向partition提交(commit)消息時(shí)泊柬,partition會先將消息持久化到文件中椎镣。
  • 這還不夠。如果這時(shí)候kafka的這一臺機(jī)器掛了呢兽赁?所以這時(shí)候這份消息還不能被消費(fèi)状答。
  • 為了提高可靠性,kafka支持為每個(gè)partition(leader)設(shè)置備份parition(follower). 可以設(shè)置多個(gè)刀崖。
  • follower唯一的職責(zé)惊科,就是消費(fèi)leader中的所有消息,并持久化在自身的隊(duì)列中亮钦。
  • 當(dāng)超過一半的parition(包括follower和leader)都存儲了消息之后译断,leader partition向producer返回ack, 表示消息接收成功。
  • 所以或悲,只要kafka向producer承諾了交付,消息就基本丟不了堪唐。只有當(dāng)超過一半的機(jī)器(follower + leader)同時(shí)失效巡语,消息才會丟失。

如果partition存儲消息成功淮菠,在向producer放送ack時(shí)網(wǎng)絡(luò)錯(cuò)誤怎么辦男公?

  • 這時(shí)producer并不知道消息是否可靠到達(dá)parition,只有選擇重發(fā)。
  • 當(dāng)partition再次收到同一條消息時(shí)合陵,不能確定此消息是重發(fā)的枢赔,還是全新的。所以只有硬著頭皮再存一遍拥知。
  • 因此踏拜,kafka中,消息是可能重復(fù)的低剔。雖然可以通過讓producer生成一個(gè)唯一id的方法來解決此問題速梗,但當(dāng)前版本的kafka沒有這樣做。

在partition內(nèi)部如何可靠襟齿?

  • 實(shí)際上producer在向parition發(fā)送消息時(shí)姻锁,消息已經(jīng)得到了可靠的存儲。
  • 當(dāng)leader partition失效時(shí)猜欺,kafka會從備份partition中選舉一個(gè)新的leader繼續(xù)提供服務(wù)位隶。

從partition交付到consumer如何可靠?

  • 當(dāng)消費(fèi)者拉取一條消息時(shí)开皿,有兩種選擇涧黄。
  • 一是先向kafka回復(fù)說:”我已經(jīng)成功消費(fèi)了“,然后再執(zhí)行業(yè)務(wù)邏輯
  • 二是先執(zhí)行業(yè)務(wù)邏輯篮昧,然后通知kafka ”我已經(jīng)成功消費(fèi)“
  • 如果使用第一種方法,那么如果在執(zhí)行業(yè)務(wù)邏輯的過程中異常弓熏,則會造成消息丟失的情況恋谭。kafka對此并不知情。
  • 如果采用第二種方法挽鞠,那么如果業(yè)務(wù)執(zhí)行失敗疚颊,則kafka無法收到消費(fèi)確認(rèn)的ack。由于kafka并不能確定是因?yàn)闃I(yè)務(wù)邏輯失敗信认,還是因?yàn)榫W(wǎng)絡(luò)問題導(dǎo)致ack消息沒有收到材义,因此下一次消費(fèi)時(shí)會重新消費(fèi)此消息。這就導(dǎo)致同一個(gè)消息被重復(fù)消費(fèi)兩次嫁赏。

那么消息的重復(fù)消費(fèi)怎么解決呢其掂?

  • 還是老方法,通過id進(jìn)行冪等潦蝇。當(dāng)消息被消費(fèi)第二次時(shí)款熬,發(fā)現(xiàn)已經(jīng)消費(fèi)過了,則不再執(zhí)行攘乒,直接返回執(zhí)行成功即可贤牛。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市则酝,隨后出現(xiàn)的幾起案子殉簸,更是在濱河造成了極大的恐慌,老刑警劉巖沽讹,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件般卑,死亡現(xiàn)場離奇詭異,居然都是意外死亡爽雄,警方通過查閱死者的電腦和手機(jī)蝠检,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挚瘟,“玉大人蝇率,你說我怎么就攤上這事」粽矗” “怎么了本慕?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侧漓。 經(jīng)常有香客問我锅尘,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任藤违,我火速辦了婚禮浪腐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顿乒。我一直安慰自己议街,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布璧榄。 她就那樣靜靜地躺著特漩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骨杂。 梳的紋絲不亂的頭發(fā)上涂身,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音搓蚪,去河邊找鬼蛤售。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妒潭,可吹牛的內(nèi)容都是我干的悴能。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雳灾,長吁一口氣:“原來是場噩夢啊……” “哼漠酿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起佑女,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谈竿,沒想到半個(gè)月后团驱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡空凸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年嚎花,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呀洲。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡紊选,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出道逗,到底是詐尸還是另有隱情兵罢,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布滓窍,位于F島的核電站卖词,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吏夯。R本人自食惡果不足惜此蜈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一即横、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裆赵,春花似錦东囚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陈醒,卻和暖如春惕橙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钉跷。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工弥鹦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爷辙。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓彬坏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膝晾。 傳聞我的和親對象是個(gè)殘疾皇子栓始,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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