kafka學(xué)習(xí)筆記

一 kafka是什么

kafka是一個(gè)分布式的消息隊(duì)列瞄桨,有高性能遣疯,擴(kuò)展性高等優(yōu)點(diǎn)。所謂的消息隊(duì)列就是發(fā)送者通過網(wǎng)絡(luò)套接字發(fā)送消息扶镀,接收者接收消息蕴侣,在這一切發(fā)生的同時(shí),還需要有工具去管理消費(fèi)者消費(fèi)到哪里臭觉,以及高可用等問題睛蛛,這一切就組成了消息隊(duì)列鹦马。

  • kafka架構(gòu)圖

    kafka從基本構(gòu)成上來說有三大要素,producer,broker,consumer忆肾,producer負(fù)責(zé)發(fā)送消息荸频,broker負(fù)責(zé)管理消息,consumer負(fù)責(zé)消費(fèi)消息客冈。消息需要按照不同的topic進(jìn)行分類旭从,topic是一個(gè)邏輯上的概念,在物理上场仲,每個(gè)topic還要分成不同的partition和悦,對(duì)應(yīng)到真實(shí)的存儲(chǔ):每個(gè)topic會(huì)有一個(gè)文件夾,文件夾下面存放著不同的日志文件渠缕,這些文件就是partition鸽素。producer發(fā)送到哪個(gè)partition也是可以指定的。kafka的整體結(jié)構(gòu)如圖:

  • producer,broker,consumer

二 消息發(fā)送過程

1 api介紹

kafka有high level api和low level api亦鳞,high level幫助我們管理了offset等功能馍忽,low level需要自己去管理消費(fèi)的offset,一般來說都是采用high level燕差。

2 消息發(fā)送

2.1 基礎(chǔ)內(nèi)容

生產(chǎn)者在發(fā)送消息時(shí)遭笋,api中有若干可選項(xiàng):topic,value必填,標(biāo)記著你需要往哪個(gè)隊(duì)列中發(fā)送什么內(nèi)容徒探,key和partition是可選項(xiàng)瓦呼,可以將message發(fā)入指定的分區(qū)中,有partition就發(fā)往指定partition中测暗,如果沒有partition就根據(jù)key去發(fā)送央串,有key就將key值hash后除余,如果連key都沒有碗啄,則根據(jù)round-robin輪訓(xùn)寫入蹋辅。
我們都知道,kafka是一個(gè)分布式的挫掏,高可用的消息隊(duì)列,所謂的分布式秩命,就是消息的存儲(chǔ)具有水平擴(kuò)展的能力尉共,一個(gè)topic的消息可以存儲(chǔ)在不同的物理機(jī)上;所謂的高可用指的是弃锐,同一條消息袄友,會(huì)在備份的機(jī)器上存在。凡是分布式的系統(tǒng)霹菊,就一定存在CAP的問題剧蚣。下面說明一下支竹,kafka在發(fā)送消息時(shí)都做了什么:

  • 1.正常情況下,在發(fā)送消息時(shí)鸠按,producer就往指定的partition發(fā)送消息礼搁,由partition擁有的所有broker中的leader進(jìn)行處理。
  • 2.當(dāng)partition的leader broker掛掉時(shí)目尖,會(huì)重新選舉出新的leader處理producer的寫入請(qǐng)求馒吴。

2.2 producer怎么才算成功寫入消息?

producer寫消息的內(nèi)容分為如下幾步:

  • producer向partition的leader broker進(jìn)行寫請(qǐng)求瑟曲。
  • leader把消息寫入日志中饮戳。
  • 幾臺(tái)備份broker從leader中pull消息出來。
    對(duì)應(yīng)的消息寫入成功標(biāo)志也分為3種洞拨,request.required.acks有三個(gè)可以設(shè)置的值:0扯罐,1,-1
  • 0 代表不管broker是否返回都算寫入成功烦衣。
  • 1 代表leader返回成功就算成功歹河。
  • -1代表所有主備broker都寫成功才算成功。

3 offset的保存

offset是partition中一條消息的唯一標(biāo)識(shí)序號(hào)琉挖,可以通過offet在日志文件中找到指定的消息启泣。

三 消息消費(fèi)過程

1 基本概念

消費(fèi)的基本要求是:同一個(gè)group內(nèi)的consumer只會(huì)消費(fèi)同一個(gè)topic內(nèi)的消息一次,不同的group可以消費(fèi)同一個(gè)topic示辈,kafka的做法是:同一個(gè)group內(nèi)的consumer被劃分為只能消費(fèi)指定的partition寥茫,如果consumer掛掉,那么由broker進(jìn)行重新分配矾麻。這種關(guān)系通過心跳連接維持纱耻。
這里需要注意的一點(diǎn)是:partition和consumer的關(guān)系是多對(duì)一的關(guān)系,如果consumer的數(shù)量多于partition的數(shù)量险耀,那么必定有consumer沒有消息可以消費(fèi)弄喘。

2 消費(fèi)者offset

在kafka 0.1版本之前,消費(fèi)者的offset保存在zookeeper中甩牺,但是由于zookeeper的性能問題蘑志,這種方式不太適合kafka,所以后來kafka進(jìn)行了變更:將其存放在了 __consumeroffsets這個(gè)topic中贬派。
在進(jìn)行消息寫入時(shí)急但,具體寫入哪個(gè)partition由消費(fèi)組ID的hash值決定。

__consumers_offsets partition =
           Math.abs(groupId.hashCode() % groupMetadataTopicPartitionCount)   
//groupMetadataTopicPartitionCount由offsets.topic.num.partitions指定搞乏,默認(rèn)是50個(gè)分區(qū)波桩。

__consumeroffsets中存入的是KV型數(shù)據(jù),key的值由groupid,partition,topic三者共同決定(groupid-topic-partition)请敦,這就意味著:在同一個(gè)group內(nèi)镐躲,只能有一個(gè)consumer消費(fèi)指定topic的指定partition消息储玫。
consumer讀取消費(fèi)位置用到了緩存,每次consumer消費(fèi)完消息后萤皂,會(huì)追加寫一條記錄到topic中撒穷,同時(shí),系統(tǒng)維護(hù)了一個(gè)緩存敌蚜,在提交后桥滨,會(huì)將consumer的消費(fèi)offset緩存值進(jìn)行更新,每次consumer拉取消費(fèi)位置弛车,從緩存中取出數(shù)據(jù)即可齐媒,不必每次都去遍歷這個(gè)log記錄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纷跛,一起剝皮案震驚了整個(gè)濱河市喻括,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贫奠,老刑警劉巖唬血,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唤崭,居然都是意外死亡拷恨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門谢肾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腕侄,“玉大人,你說我怎么就攤上這事芦疏∶岣埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵酸茴,是天一觀的道長分预。 經(jīng)常有香客問我,道長薪捍,這世上最難降的妖魔是什么笼痹? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮酪穿,結(jié)果婚禮上凳干,老公的妹妹穿的比我還像新娘。我一直安慰自己昆稿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布息拜。 她就那樣靜靜地躺著溉潭,像睡著了一般净响。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喳瓣,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天馋贤,我揣著相機(jī)與錄音,去河邊找鬼畏陕。 笑死配乓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惠毁。 我是一名探鬼主播犹芹,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鞠绰!你這毒婦竟也來了腰埂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蜈膨,失蹤者是張志新(化名)和其女友劉穎屿笼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翁巍,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驴一,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灶壶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肝断。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖例朱,靈堂內(nèi)的尸體忽然破棺而出孝情,到底是詐尸還是另有隱情,我是刑警寧澤洒嗤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布箫荡,位于F島的核電站,受9級(jí)特大地震影響渔隶,放射性物質(zhì)發(fā)生泄漏羔挡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一间唉、第九天 我趴在偏房一處隱蔽的房頂上張望绞灼。 院中可真熱鬧,春花似錦呈野、人聲如沸低矮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽军掂。三九已至轮蜕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝗锥,已是汗流浹背跃洛。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留终议,地道東北人汇竭。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像穴张,于是被迫代替她去往敵國和親细燎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354