Kafka簡介(02)- Kafka基礎(chǔ)概念

點(diǎn)對點(diǎn)消息系統(tǒng)

簡單來說就是生產(chǎn)者(Producer)發(fā)送消息到隊(duì)列,消費(fèi)者(Consumer)從隊(duì)列中取出消息耕拷。這種模型的特點(diǎn)就是一條消息只會被一個消費(fèi)者接收纺棺,一但有消費(fèi)者消費(fèi)了這條消息壳坪,其他消費(fèi)者就沒辦法重復(fù)消費(fèi)了午磁。



發(fā)布-訂閱消息系統(tǒng)

發(fā)布訂閱的模型也比較好理解笋妥,首先消費(fèi)者需要訂閱這個隊(duì)列懊昨,生產(chǎn)者只要發(fā)送一條消息到隊(duì)列中,所有已訂閱該隊(duì)列的的消費(fèi)者都能接收到該消息春宣,未訂閱的用戶則無法接收疚颊。就像我們的微信關(guān)注微信公眾號一樣,只有關(guān)注了的用戶才會收到公眾號推送的消息信认。



Kafka

Kafka異軍突起材义,是非常火熱的一款消息中間件嫁赏。消息中間件的作用非常多其掂,常用作系統(tǒng)業(yè)務(wù)的解耦。例如最常聽到的秒殺業(yè)務(wù)潦蝇,我們也能使用消息中間件對業(yè)務(wù)進(jìn)行解耦款熬,用戶發(fā)起秒殺請求后,系統(tǒng)首先會將該請求轉(zhuǎn)發(fā)到中間件中攘乒,然后返回一個等待的結(jié)果(用戶界面顯示正在搶購贤牛,請耐心等待),而我們系統(tǒng)會有監(jiān)聽器去接收這些秒殺請求進(jìn)行對應(yīng)的業(yè)務(wù)處理则酝,最重要的是殉簸,整個系統(tǒng)的擴(kuò)展顯得非常簡單,我們只需要部署Kafka的集群沽讹,以及后臺的負(fù)載均衡就能快速提高系統(tǒng)的訪問并發(fā)量般卑。

Kafka的最大的特點(diǎn)就是高吞吐量以及可水平擴(kuò)展,正因這兩點(diǎn)Kafka非常適合處理數(shù)據(jù)量龐大的業(yè)務(wù)爽雄,例如使用Kafka做日志分析蝠检、數(shù)據(jù)計(jì)算。新版本Kafka也推出了Stream API挚瘟,可以更好的支持?jǐn)?shù)據(jù)流處理叹谁。基于這些特性我們可以實(shí)現(xiàn)非常多的系統(tǒng)功能乘盖。



Broker

Broker為節(jié)點(diǎn)的意思焰檩,我們啟動的單個Kafka實(shí)例則為一個Broker,多個Broker可以組成Kafka集群侧漓。broker接收來著生產(chǎn)者的消息锅尘,為消息設(shè)置偏移量监氢,并提交消息到磁盤保存布蔗,broker為消費(fèi)者提供消息藤违,對讀取分區(qū)的請求作出響應(yīng),返回已經(jīng)提交到磁盤上的消息纵揍,根據(jù)特定的硬件及其特性顿乒,單個broker可以輕松處理數(shù)千個分區(qū)以及每秒百萬級的消息量。



集群

broker是集群的組成部分泽谨。每個集群都有一個broker同時充當(dāng)了集群控制器的角色(自動從活躍成員中選舉)璧榄,控制器負(fù)責(zé)管理工作,包括將分區(qū)分配給broker和監(jiān)控broker吧雹,在集群中骨杂,如果一個分區(qū)從屬于一個broker,該broker被稱為分區(qū)的首領(lǐng)雄卷。一個分區(qū)可以分配給多個broker搓蚪,這時候會發(fā)生分區(qū)復(fù)制,這種復(fù)制機(jī)制為分區(qū)提供了消息冗余丁鹉,如果有一個broker失效妒潭,其他broker可以接管領(lǐng)導(dǎo)權(quán),不過相關(guān)的消費(fèi)者和生產(chǎn)者都要重新連接到新的首領(lǐng)揣钦。

保留消息(在一定期限內(nèi))是kafka的一個重要特性雳灾,默認(rèn)保留策略:要么保留一段時間,要么保留到消息達(dá)到一定大小的字節(jié)數(shù)冯凹,當(dāng)消息達(dá)到上限時谎亩,舊消息就會過期并刪除,所以在任何時間宇姚,消息總量都不會超過配置指定的大小团驱。另外主題可以配置自己的保留策略,可以將消息保留到不再使用為止空凸。還可以通過配置把主題當(dāng)做緊湊型日志嚎花,只有最后一個帶有特定建的消息會被保留下來,這種情況對于變更日志類型的數(shù)據(jù)來說比較適用呀洲,因?yàn)橹恍枰P(guān)系最后時刻發(fā)生的變更紊选。




多集群

如果越來越多的系統(tǒng)都發(fā)消息給kafka,那么最好適用多集群模式道逗,原因包括:

數(shù)據(jù)類型分離

安全需求隔離

多數(shù)據(jù)中心(災(zāi)難恢復(fù))

如果使用多個數(shù)據(jù)中心兵罢,就需要在它們之間復(fù)制消息,這樣在線應(yīng)用程序才可以訪問到多個站點(diǎn)的用戶活動信息滓窍,例如一個用戶修改了他的資料卖词,不管從哪個數(shù)據(jù)中心,都應(yīng)該能看到這些改動,也可以多個站點(diǎn)的監(jiān)控?cái)?shù)據(jù)都聚集到一個部署了分析和告警系統(tǒng)的中心位置此蜈。不過即横,kafka本身的消息復(fù)制只能在單集群內(nèi)進(jìn)行,不能再多個集群間進(jìn)行裆赵。

kafka的MirrorMaker工具可以實(shí)現(xiàn)集群間的消息復(fù)制东囚,MirrorMaker的核心組件包含了一個生產(chǎn)者和一個消費(fèi)者,兩者之間通過一個隊(duì)列相連战授。消費(fèi)者從一個集群讀取消息页藻,生產(chǎn)者把消息發(fā)送到另一個集群上,不過這種方式在創(chuàng)建復(fù)雜的數(shù)據(jù)管道方面顯得有點(diǎn)力不從心植兰。




Topic

Topic為主題的意思份帐,也就是相當(dāng)于消息系統(tǒng)中的隊(duì)列(queue)。kafka的消息通過主題進(jìn)行分類楣导,主題就好比數(shù)據(jù)庫的表弥鹦,或者文件系統(tǒng)里的文件夾,一個Topic中存在多個Partition爷辙,一個分區(qū)就是一個提交日志彬坏,消息以追加的方式寫入分區(qū),因?yàn)闊o法在整個主題范圍內(nèi)保證消息的順序膝晾,但可以保證消息在單個分區(qū)內(nèi)的順序栓始。很多時候,人們把一個主題的數(shù)據(jù)看成一個流血当,不管它有多少個分區(qū)幻赚,流是一組從生產(chǎn)者移動到消費(fèi)者的數(shù)據(jù),Kafka Streams等這些框架以實(shí)時的方式處理消息臊旭,也即是所謂的流式處理落恼。可以用流式處理和離線處理進(jìn)行比較(例如Hadoop)离熏。



Partition

Partition為分區(qū)的意思佳谦,是構(gòu)成Kafka存儲結(jié)構(gòu)的最小單位,kafka通過分區(qū)來實(shí)現(xiàn)數(shù)據(jù)冗余和伸縮性滋戳,分區(qū)可以分布在不同的服務(wù)器上钻蔑,也就是說一個主題可以橫跨多個服務(wù)器,以此來提供比單個服務(wù)器更強(qiáng)大的性能奸鸯。



Partition offset

offset為消息偏移量咪笑,以Partition為單位,即使在同一個Topic中娄涩,不同Partition的offset也是重新開始計(jì)算(也就是會重復(fù))



生產(chǎn)者

生產(chǎn)者創(chuàng)建消息窗怒,也被稱為發(fā)布者或者寫入者,一般一個消息會被發(fā)布到一個特定的主題上,一般情況會均衡的分布到主題的所有分區(qū)上扬虚,而并不關(guān)心特定消息會被寫到哪個分區(qū)努隙,不過,某些情況也可以寫到指定分區(qū)孔轴,這通常是通過消息鍵和分區(qū)器來實(shí)現(xiàn)剃法。分區(qū)器為鍵生成一個散列值碎捺,并將其映射到指定分區(qū)上路鹰,這樣可以保證同一個鍵的消息會寫到同一個分區(qū)上,在某些情況下可以實(shí)現(xiàn)順序性收厨。分區(qū)器也可以自定義晋柱。




消費(fèi)者

消費(fèi)者讀取消息,也可以叫做訂閱者或者讀者诵叁。消費(fèi)者訂閱一個或者多個主題雁竞,并按照消息生成的順序讀取它們。消費(fèi)者通過檢查消息的偏移量來區(qū)分已經(jīng)讀取過的消息拧额,偏移量是另一種元數(shù)據(jù)碑诉,它是一個不斷遞增的整數(shù)值,在創(chuàng)建消息時侥锦,kafka會把它添加到消息里进栽,在給定的分區(qū)里,每個消息的偏移量都是唯一的恭垦,消費(fèi)者把每個分區(qū)最后讀取的消息偏移量保存在zookeeper或者kafka上快毛,如果消費(fèi)者關(guān)閉或重啟,它的讀取狀態(tài)不會丟失番挺。




Group

Group為消費(fèi)者組的意思唠帝,一個Group里面包含多個消費(fèi)者,也就是說玄柏,會有一個或者多個消費(fèi)者共同讀取一個主題襟衰,群組保證每個分區(qū)只能被一個消費(fèi)者使用。消費(fèi)者與分區(qū)之間的映射通常被稱為消費(fèi)者對分區(qū)的所有權(quán)關(guān)系粪摘。通過這種方式右蒲,消費(fèi)者可以消費(fèi)包含大量消息的主題,而且如果一個消費(fèi)者失敗赶熟,群組中其他成員可以接管失效消費(fèi)者的工作瑰妄。



Message

Message為消息的意思,Kafka的數(shù)據(jù)單元被稱為消息映砖,可以把消息看成是數(shù)據(jù)庫里的一行或者一條記錄间坐。消息由字節(jié)數(shù)組組成,所以對于kafka來說,消息里的數(shù)據(jù)沒有特別的格式或者含義竹宋,消息可以有一個可選的元數(shù)據(jù)劳澄,也就是鍵(key),鍵也是一個字節(jié)數(shù)組蜈七,同樣沒有特殊的含義秒拔。當(dāng)消息以一種可控的方式寫入不同的分區(qū)時,會用到鍵飒硅。最簡單的例子就是為鍵生成一個一致性散列值砂缩,然后使用散列值對主題分區(qū)數(shù)進(jìn)行取模,為消息選取分區(qū)三娩,這樣可以保證具有相同鍵的消息總是被寫到相同的分區(qū)上庵芭。

這里就需要說說為什么這樣設(shè)計(jì)了:

首先Topic中有分區(qū)的概念,每個分區(qū)保存各自的數(shù)據(jù)雀监,而我們的Group這對應(yīng)著Topic双吆,也就是這個Topic中的數(shù)據(jù)都是由該Group去消費(fèi),也就是允許多個消費(fèi)者同時消費(fèi)会前,這樣能大大提高Kafka的吞吐量好乐。不過這樣的設(shè)計(jì)也會帶來不少的不便,比如特定場景下你需要去維護(hù)多個Partition之間的關(guān)系瓦宜。這里就不多講了蔚万。



批次

為了提高效率,消息被分批次寫入kafka歉提,批次就是一組消息笛坦,這些消息屬于同一個主題和分區(qū)。如果每一個消息都單獨(dú)穿行于網(wǎng)絡(luò)苔巨,會導(dǎo)致大量的網(wǎng)絡(luò)開銷版扩,把消息分成批次傳輸可以減少網(wǎng)絡(luò)開銷,不過侄泽,這要在延遲和吞吐量上作出權(quán)衡礁芦,批次越大,單位時間處理的消息也越多悼尾,單個消息的傳輸時間就越長柿扣。批次數(shù)據(jù)會被壓縮,這樣可以提升數(shù)據(jù)的傳輸和存儲能力闺魏,但是要做更多的計(jì)算處理未状。



模式

對于kafka來說,消息就是晦澀難懂的字節(jié)數(shù)組析桥。所以有人建議使用一些額外的結(jié)構(gòu)來定義消息內(nèi)容司草,這樣更加容易理解艰垂。根據(jù)需求,消息模式有許多可用的選項(xiàng)埋虹。想JSON和XML這些簡單的系統(tǒng)猜憎,易用而且可讀性好。不過它們?nèi)狈?qiáng)類型處理能力搔课,而且不同版本的兼容性也不是很好胰柑。許多kafka使用者喜歡用Apache Avro,它最初是為Hadoop開發(fā)的一款序列化框架爬泥,Avro提供了一種緊湊的序列化格式柬讨,模式和消息體是分開的,當(dāng)模式發(fā)生變化時急灭,不需要重新生成代碼姐浮,它還支持強(qiáng)類型和模式進(jìn)化谷遂,其版本既向前兼容也向后兼容葬馋。

數(shù)據(jù)格式的一致性對kafka很重要,它消除了消息讀寫之間的耦合性肾扰,如果讀寫操作緊密的耦合在一起畴嘶,消息訂閱者則需要升級系統(tǒng)才能同時處理新舊兩種數(shù)據(jù)格式。在消息訂閱者升級了之后集晚,消息發(fā)布者才跟著升級窗悯,以便使用新的數(shù)據(jù)格式,新的應(yīng)用程序如果需要使用數(shù)據(jù)偷拔,就要與消息發(fā)布者發(fā)生耦合蒋院,導(dǎo)致開發(fā)者需要做很多繁雜的工作。定義良好的模式莲绰,并把它們放在公共倉庫欺旧,可以方便我們理解kafka的消息結(jié)構(gòu)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛤签,一起剝皮案震驚了整個濱河市辞友,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌震肮,老刑警劉巖称龙,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異戳晌,居然都是意外死亡鲫尊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門沦偎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疫向,“玉大人竞帽,你說我怎么就攤上這事『枧酰” “怎么了屹篓?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匙奴。 經(jīng)常有香客問我堆巧,道長,這世上最難降的妖魔是什么泼菌? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任谍肤,我火速辦了婚禮,結(jié)果婚禮上哗伯,老公的妹妹穿的比我還像新娘荒揣。我一直安慰自己,他們只是感情好焊刹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布系任。 她就那樣靜靜地躺著,像睡著了一般虐块。 火紅的嫁衣襯著肌膚如雪俩滥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天贺奠,我揣著相機(jī)與錄音霜旧,去河邊找鬼。 笑死儡率,一個胖子當(dāng)著我的面吹牛挂据,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播儿普,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼崎逃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箕肃?” 一聲冷哼從身側(cè)響起婚脱,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勺像,沒想到半個月后障贸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吟宦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年篮洁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殃姓。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡袁波,死狀恐怖瓦阐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情篷牌,我是刑警寧澤睡蟋,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站枷颊,受9級特大地震影響戳杀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夭苗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一信卡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧题造,春花似錦傍菇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仔蝌,卻和暖如春泛领,著一層夾襖步出監(jiān)牢的瞬間荒吏,已是汗流浹背敛惊。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绰更,地道東北人瞧挤。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像儡湾,于是被迫代替她去往敵國和親特恬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

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

  • 當(dāng)我?guī)е燥@憂郁的心情在街頭行走的時候徐钠,看到廣場上一個老外在給他的同伴拍照癌刽。大概是為了更好角度,或是為了把特別的景...
    俗然閱讀 505評論 2 7
  • 我和阿樹第一次單獨(dú)吃飯是在幾年前的冬天尝丐。 已經(jīng)有六显拜、七年沒有見過面,我有些擔(dān)心還能不能認(rèn)出他來爹袁。 不過這點(diǎn)擔(dān)心很快...
    燚煖閱讀 916評論 0 6
  • 線程 python中的線程 不同的進(jìn)程之間是充滿敵意的远荠,彼此是搶占、競爭cpu的關(guān)系失息,如果迅雷會和QQ搶資源譬淳。而同...
    Snackk閱讀 723評論 0 0