kafka1

目錄


正文


一撮竿、簡介

1.1 概述

Kafka是最初由Linkedin公司開發(fā),是一個分布式薯定、分區(qū)的庞钢、多副本的、多訂閱者褪尝,基于zookeeper協(xié)調(diào)的分布式日志系統(tǒng)(也可以當做MQ系統(tǒng))闹获,常見可以用于web/nginx日志、訪問日志河哑,消息服務等等避诽,Linkedin于2010年貢獻給了Apache基金會并成為頂級開源項目。

主要應用場景是:日志收集系統(tǒng)和消息系統(tǒng)璃谨。

Kafka主要設計目標如下:

以時間復雜度為O(1)的方式提供消息持久化能力沙庐,即使對TB級以上數(shù)據(jù)也能保證常數(shù)時間的訪問性能。

高吞吐率佳吞。即使在非常廉價的商用機器上也能做到單機支持每秒100K條消息的傳輸拱雏。

支持Kafka Server間的消息分區(qū),及分布式消費底扳,同時保證每個partition內(nèi)的消息順序傳輸铸抑。

同時支持離線數(shù)據(jù)處理和實時數(shù)據(jù)處理。

Scale out:支持在線水平擴展

1.2 消息系統(tǒng)介紹

一個消息系統(tǒng)負責將數(shù)據(jù)從一個應用傳遞到另外一個應用衷模,應用只需關(guān)注于數(shù)據(jù)鹊汛,無需關(guān)注數(shù)據(jù)在兩個或多個應用間是如何傳遞的。分布式消息傳遞基于可靠的消息隊列阱冶,在客戶端應用和消息系統(tǒng)之間異步傳遞消息刁憋。有兩種主要的消息傳遞模式:點對點傳遞模式、發(fā)布-訂閱模式木蹬。大部分的消息系統(tǒng)選用發(fā)布-訂閱模式至耻。Kafka就是一種發(fā)布-訂閱模式

1.3 點對點消息傳遞模式

在點對點消息系統(tǒng)中,消息持久化到一個隊列中尘颓。此時是尖,將有一個或多個消費者消費隊列中的數(shù)據(jù)。但是一條消息只能被消費一次泥耀。當一個消費者消費了隊列中的某條數(shù)據(jù)之后,該條數(shù)據(jù)則從消息隊列中刪除蛔添。該模式即使有多個消費者同時消費數(shù)據(jù)痰催,也能保證數(shù)據(jù)處理的順序。這種架構(gòu)描述示意圖如下:

生產(chǎn)者發(fā)送一條消息到queue迎瞧,只有一個消費者能收到夸溶。

1.4 發(fā)布-訂閱消息傳遞模式

在發(fā)布-訂閱消息系統(tǒng)中,消息被持久化到一個topic中凶硅。與點對點消息系統(tǒng)不同的是缝裁,消費者可以訂閱一個或多個topic,消費者可以消費該topic中所有的數(shù)據(jù)足绅,同一條數(shù)據(jù)可以被多個消費者消費捷绑,數(shù)據(jù)被消費后不會立馬刪除。在發(fā)布-訂閱消息系統(tǒng)中氢妈,消息的生產(chǎn)者稱為發(fā)布者粹污,消費者稱為訂閱者。該模式的示例圖如下:

發(fā)布者發(fā)送到topic的消息首量,只有訂閱了topic的訂閱者才會收到消息壮吩。


二、Kafka的優(yōu)點

2.1 解耦

在項目啟動之初來預測將來項目會碰到什么需求加缘,是極其困難的鸭叙。消息系統(tǒng)在處理過程中間插入了一個隱含的、基于數(shù)據(jù)的接口層拣宏,兩邊的處理過程都要實現(xiàn)這一接口沈贝。這允許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束蚀浆。

2.2 冗余(副本)

有些情況下缀程,處理數(shù)據(jù)的過程會失敗。除非數(shù)據(jù)被持久化市俊,否則將造成丟失杨凑。消息隊列把數(shù)據(jù)進行持久化直到它們已經(jīng)被完全處理,通過這一方式規(guī)避了數(shù)據(jù)丟失風險摆昧。許多消息隊列所采用的"插入-獲取-刪除"范式中撩满,在把一個消息從隊列中刪除之前,需要你的處理系統(tǒng)明確的指出該消息已經(jīng)被處理完畢,從而確保你的數(shù)據(jù)被安全的保存直到你使用完畢伺帘。

2.3 擴展性

因為消息隊列解耦了你的處理過程昭躺,所以增大消息入隊和處理的頻率是很容易的,只要另外增加處理過程即可伪嫁。不需要改變代碼领炫、不需要調(diào)節(jié)參數(shù)。擴展就像調(diào)大電力按鈕一樣簡單张咳。

2.4 靈活性&峰值處理能力

在訪問量劇增的情況下帝洪,應用仍然需要繼續(xù)發(fā)揮作用,但是這樣的突發(fā)流量并不常見脚猾;如果為以能處理這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費葱峡。使用消息隊列能夠使關(guān)鍵組件頂住突發(fā)的訪問壓力,而不會因為突發(fā)的超負荷的請求而完全崩潰龙助。

2.5 可恢復性

系統(tǒng)的一部分組件失效時砰奕,不會影響到整個系統(tǒng)。消息隊列降低了進程間的耦合度提鸟,所以即使一個處理消息的進程掛掉军援,加入隊列中的消息仍然可以在系統(tǒng)恢復后被處理。

2.6 順序保證

在大多使用場景下沽一,數(shù)據(jù)處理的順序都很重要盖溺。大部分消息隊列本來就是排序的,并且能保證數(shù)據(jù)會按照特定的順序來處理铣缠。Kafka保證一個Partition內(nèi)的消息的有序性烘嘱。

2.7 緩沖

在任何重要的系統(tǒng)中,都會有需要不同的處理時間的元素蝗蛙。例如蝇庭,加載一張圖片比應用過濾器花費更少的時間。消息隊列通過一個緩沖層來幫助任務最高效率的執(zhí)行———寫入隊列的處理會盡可能的快速捡硅。該緩沖有助于控制和優(yōu)化數(shù)據(jù)流經(jīng)過系統(tǒng)的速度哮内。

2.8 異步通信

很多時候,用戶不想也不需要立即處理消息壮韭。消息隊列提供了異步處理機制北发,允許用戶把一個消息放入隊列,但并不立即處理它喷屋。想向隊列中放入多少消息就放多少琳拨,然后在需要的時候再去處理它們。


三屯曹、常用Message Queue對比

3.1 RabbitMQ

RabbitMQ是使用Erlang編寫的一個開源的消息隊列狱庇,本身支持很多的協(xié)議:AMQP惊畏,XMPP, SMTP, STOMP,也正因如此密任,它非常重量級颜启,更適合于企業(yè)級的開發(fā)。同時實現(xiàn)了Broker構(gòu)架浪讳,這意味著消息在發(fā)送給客戶端時先在中心隊列排隊缰盏。對路由,負載均衡或者數(shù)據(jù)持久化都有很好的支持淹遵。

3.2 Redis

Redis是一個基于Key-Value對的NoSQL數(shù)據(jù)庫乳规,開發(fā)維護很活躍。雖然它是一個Key-Value數(shù)據(jù)庫存儲系統(tǒng)合呐,但它本身支持MQ功能,所以完全可以當做一個輕量級的隊列服務來使用笙以。對于RabbitMQ和Redis的入隊和出隊操作淌实,各執(zhí)行100萬次,每10萬次記錄一次執(zhí)行時間猖腕。測試數(shù)據(jù)分為128Bytes拆祈、512Bytes、1K和10K四個不同大小的數(shù)據(jù)倘感。實驗表明:入隊時放坏,當數(shù)據(jù)比較小時Redis的性能要高于RabbitMQ,而如果數(shù)據(jù)大小超過了10K老玛,Redis則慢的無法忍受淤年;出隊時,無論數(shù)據(jù)大小蜡豹,Redis都表現(xiàn)出非常好的性能麸粮,而RabbitMQ的出隊性能則遠低于Redis。

3.3 ZeroMQ

ZeroMQ號稱最快的消息隊列系統(tǒng)镜廉,尤其針對大吞吐量的需求場景弄诲。ZeroMQ能夠?qū)崿F(xiàn)RabbitMQ不擅長的高級/復雜的隊列,但是開發(fā)人員需要自己組合多種技術(shù)框架娇唯,技術(shù)上的復雜度是對這MQ能夠應用成功的挑戰(zhàn)齐遵。ZeroMQ具有一個獨特的非中間件的模式,你不需要安裝和運行一個消息服務器或中間件塔插,因為你的應用程序?qū)缪葸@個服務器角色梗摇。你只需要簡單的引用ZeroMQ程序庫,可以使用NuGet安裝佑淀,然后你就可以愉快的在應用程序之間發(fā)送消息了留美。但是ZeroMQ僅提供非持久性的隊列彰檬,也就是說如果宕機,數(shù)據(jù)將會丟失谎砾。其中逢倍,Twitter的Storm 0.9.0以前的版本中默認使用ZeroMQ作為數(shù)據(jù)流的傳輸(Storm從0.9版本開始同時支持ZeroMQ和Netty作為傳輸模塊)。

3.4 ActiveMQ

ActiveMQ是Apache下的一個子項目景图。 類似于ZeroMQ较雕,它能夠以代理人和點對點的技術(shù)實現(xiàn)隊列。同時類似于RabbitMQ挚币,它少量代碼就可以高效地實現(xiàn)高級應用場景亮蒋。

3.5 Kafka/Jafka

Kafka是Apache下的一個子項目,是一個高性能跨語言分布式發(fā)布/訂閱消息隊列系統(tǒng)妆毕,而Jafka是在Kafka之上孵化而來的慎玖,即Kafka的一個升級版。具有以下特性:快速持久化笛粘,可以在O(1)的系統(tǒng)開銷下進行消息持久化趁怔;高吞吐,在一臺普通的服務器上既可以達到10W/s的吞吐速率薪前;完全的分布式系統(tǒng)润努,Broker、Producer示括、Consumer都原生自動支持分布式铺浇,自動實現(xiàn)負載均衡;支持Hadoop數(shù)據(jù)并行加載垛膝,對于像Hadoop的一樣的日志數(shù)據(jù)和離線分析系統(tǒng)鳍侣,但又要求實時處理的限制,這是一個可行的解決方案吼拥。Kafka通過Hadoop的并行加載機制統(tǒng)一了在線和離線的消息處理拱她。Apache Kafka相對于ActiveMQ是一個非常輕量級的消息系統(tǒng),除了性能非常好之外扔罪,還是一個工作良好的分布式系統(tǒng)秉沼。


四、Kafka中的術(shù)語解釋

4.1 概述

在深入理解Kafka之前矿酵,先介紹一下Kafka中的術(shù)語唬复。下圖展示了Kafka的相關(guān)術(shù)語以及之間的關(guān)系:

上圖中一個topic配置了3個partition。Partition1有兩個offset:0和1全肮。Partition2有4個offset敞咧。Partition3有1個offset。副本的id和副本所在的機器的id恰好相同辜腺。

如果一個topic的副本數(shù)為3休建,那么Kafka將在集群中為每個partition創(chuàng)建3個相同的副本乍恐。集群中的每個broker存儲一個或多個partition。多個producer和consumer可同時生產(chǎn)和消費數(shù)據(jù)测砂。

4.2 broker

Kafka 集群包含一個或多個服務器茵烈,服務器節(jié)點稱為broker。

broker存儲topic的數(shù)據(jù)砌些。如果某topic有N個partition呜投,集群有N個broker,那么每個broker存儲該topic的一個partition存璃。

如果某topic有N個partition仑荐,集群有(N+M)個broker,那么其中有N個broker存儲該topic的一個partition纵东,剩下的M個broker不存儲該topic的partition數(shù)據(jù)粘招。

如果某topic有N個partition,集群中broker數(shù)目少于N個偎球,那么一個broker存儲該topic的一個或多個partition男图。在實際生產(chǎn)環(huán)境中,盡量避免這種情況的發(fā)生甜橱,這種情況容易導致Kafka集群數(shù)據(jù)不均衡。

4.3 Topic(可理解為數(shù)據(jù)標記)

每條發(fā)布到Kafka集群的消息都有一個類別栈戳,這個類別被稱為Topic岂傲。(物理上不同Topic的消息分開存儲,邏輯上一個Topic的消息雖然保存于一個或多個broker上但用戶只需指定消息的Topic即可生產(chǎn)或消費數(shù)據(jù)而不必關(guān)心數(shù)據(jù)存于何處)

類似于數(shù)據(jù)庫的表名

4.3Partition(數(shù)據(jù)無序情況下最有用子檀,partition實現(xiàn)了可通過擴展機器提高速度的功能)(在無序的情況下镊掖,此功能一般才發(fā)揮其優(yōu)勢,可橫向擴展提高速度褂痰,broker越多亩进,速度越快)

topic中的數(shù)據(jù)分割為一個或多個partition。每個topic至少有一個partition缩歪。每個partition中的數(shù)據(jù)使用多個segment文件存儲归薛。partition中的數(shù)據(jù)是有序的,不同partition間的數(shù)據(jù)丟失了數(shù)據(jù)的順序匪蝙。如果topic有多個partition主籍,消費數(shù)據(jù)時就不能保證數(shù)據(jù)的順序。在需要嚴格保證消息的消費順序的場景下逛球,需要將partition數(shù)目設為1千元。

4.4 Producer

生產(chǎn)者即數(shù)據(jù)的發(fā)布者,該角色將消息發(fā)布到Kafka的topic中颤绕。broker接收到生產(chǎn)者發(fā)送的消息后幸海,broker將該消息追加到當前用于追加數(shù)據(jù)的segment文件中祟身。生產(chǎn)者發(fā)送的消息,存儲到一個partition中物独,生產(chǎn)者也可以指定數(shù)據(jù)存儲的partition袜硫。

4.5 Consumer

消費者可以從broker中讀取數(shù)據(jù)。消費者可以消費多個topic中的數(shù)據(jù)议纯。

4.6 Consumer Group

每個Consumer屬于一個特定的Consumer Group(可為每個Consumer指定group name父款,若不指定group name則屬于默認的group)。

4.7 Leader

每個partition有多個副本瞻凤,其中有且僅有一個作為Leader憨攒,Leader是當前負責數(shù)據(jù)的讀寫的partition。

4.8 Follower

Follower跟隨Leader阀参,所有寫請求都通過Leader路由肝集,數(shù)據(jù)變更會廣播給所有Follower,F(xiàn)ollower與Leader保持數(shù)據(jù)同步蛛壳。如果Leader失效杏瞻,則從Follower中選舉出一個新的Leader。當Follower與Leader掛掉衙荐、卡住或者同步太慢捞挥,leader會把這個follower從“in sync replicas”(ISR)列表中刪除,重新創(chuàng)建一個Follower忧吟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砌函,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子溜族,更是在濱河造成了極大的恐慌讹俊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煌抒,死亡現(xiàn)場離奇詭異仍劈,居然都是意外死亡,警方通過查閱死者的電腦和手機寡壮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門贩疙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人况既,你說我怎么就攤上這事屋群。” “怎么了坏挠?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵芍躏,是天一觀的道長。 經(jīng)常有香客問我降狠,道長对竣,這世上最難降的妖魔是什么庇楞? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮否纬,結(jié)果婚禮上吕晌,老公的妹妹穿的比我還像新娘。我一直安慰自己临燃,他們只是感情好睛驳,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膜廊,像睡著了一般乏沸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爪瓜,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天蹬跃,我揣著相機與錄音,去河邊找鬼铆铆。 笑死蝶缀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的薄货。 我是一名探鬼主播翁都,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谅猾!你這毒婦竟也來了柄慰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赊瞬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贼涩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巧涧,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年遥倦,在試婚紗的時候發(fā)現(xiàn)自己被綠了谤绳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡袒哥,死狀恐怖缩筛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堡称,我是刑警寧澤瞎抛,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站却紧,受9級特大地震影響桐臊,放射性物質(zhì)發(fā)生泄漏胎撤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一断凶、第九天 我趴在偏房一處隱蔽的房頂上張望伤提。 院中可真熱鬧,春花似錦认烁、人聲如沸肿男。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舶沛。三九已至,卻和暖如春稽穆,著一層夾襖步出監(jiān)牢的瞬間冠王,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工舌镶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柱彻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓餐胀,卻偏偏與公主長得像哟楷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子否灾,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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

  • 一卖擅、入門1、簡介Kafka is a distributed,partitioned,replicated com...
    HxLiang閱讀 3,349評論 0 9
  • kafka專題 Kafka簡介 消息系統(tǒng)介紹 一個消息系統(tǒng)負責將數(shù)據(jù)從一個應用傳遞到另外一個應用墨技,應用只需關(guān)注于數(shù)...
    shu_ke閱讀 353評論 0 1
  • 一惩阶、前言,所謂消息隊列 一個消息系統(tǒng)負責將數(shù)據(jù)從一個應用傳遞到另外一個應用扣汪,應用只需關(guān)注于數(shù)據(jù)断楷,無需關(guān)注數(shù)據(jù)在兩個...
    Megahorn閱讀 895評論 0 0
  • 什么是消息系統(tǒng)? 早期兩個應用程序間進行消息傳遞需要保證兩個應用程序同時在線崭别,并且耦合度很高冬筒。為了解決應用程序不在...
    Java小鋪閱讀 1,216評論 0 2
  • 我喜歡發(fā)朋友圈記錄生活舞痰,不管可見不可見,生活值得記錄诀姚,很多人認為我秀恩愛响牛,一個你曾經(jīng)期待的婚姻生活難道不是兩個人的...
    醉醒依然閱讀 201評論 0 1