分布式消息系統(tǒng)Apache Kafka那些事兒

Apache Kafka是分布式發(fā)布-訂閱消息系統(tǒng)蜈抓,最初由LinkedIn開發(fā)疙剑,之后成為Apache項(xiàng)目的一部分诈胜。Apache Kafka的創(chuàng)始人之一Jay Kreps最近接受了媒體采訪裸燎,對(duì)Kafka做了深入淺出的分析竟趾,包括和其他同類項(xiàng)目的對(duì)比憔购、存儲(chǔ)原理和格式、實(shí)現(xiàn)語言等等岔帽。

** Kafka解決了什么問題玫鸟?**

Kafka是一個(gè)數(shù)據(jù)流的分布式存儲(chǔ)系統(tǒng)。它允許你發(fā)布或者訂閱數(shù)據(jù)流犀勒。它是圍繞著一個(gè)附加的持續(xù)的日志文件的概念建立起來的——發(fā)布者把數(shù)據(jù)添加到這個(gè)日志文件中屎飘,消費(fèi)者則訂閱它的變化。也許最重要的是贾费,它可擴(kuò)展性真的很棒钦购,所以像Linkedin或Netflix或Uber這樣擁有大量數(shù)據(jù)的公司也可以用它作為數(shù)據(jù)流的中央樞紐。


** 為什么RabbitMQ褂萧、ActiveMQ等類似開源項(xiàng)目對(duì)這個(gè)問題不那么管用押桃? **

Kafka有一些與眾不同的東西:

它是在現(xiàn)代分布式系統(tǒng)的基礎(chǔ)上建立起來的,易于復(fù)制导犹、容錯(cuò)和分區(qū)唱凯。你可以把Kafka想象成是一個(gè)cluster,而不是一個(gè)各自獨(dú)立的broker的集合谎痢。這會(huì)影響到從你如何管理它到程序如何執(zhí)行的所有事情磕昼。

Kafka在保存數(shù)據(jù)上做得很好。Kafka上的數(shù)據(jù)常常被保存并可以被重復(fù)讀取节猿。

Kafka比傳統(tǒng)的消息系統(tǒng)都要快票从,因此它很適合真正的大容量數(shù)據(jù)流,比如日志記錄的使用情況沐批,或者傳感器數(shù)據(jù)的大規(guī)模數(shù)據(jù)流纫骑。

Kafka被設(shè)計(jì)為分布式系統(tǒng)核心原語的上一層來支持其流處理過程。這就是為什么Kafka被如此廣泛的同Spark Streaming或Storm一起使用的原因九孩。


** 以哪種類型的結(jié)構(gòu)保存消息先馆,又以什么格式來保存?**

Kafka中的消息或記錄只是一個(gè)鍵-值對(duì)躺彬,這里鍵和值分別是一些字節(jié)的字符串煤墙。

Kafka提供了一個(gè)抽象的“主題”概念梅惯,這個(gè)主題被分成一個(gè)或多個(gè)(通常是很多個(gè))分區(qū),并被分散在一個(gè)節(jié)點(diǎn)組成的叢簇中仿野。主題是一種記錄的反饋铣减。應(yīng)用向主題公開記錄,然后記錄的鍵決定了這些記錄應(yīng)該位于主題的哪個(gè)分區(qū)脚作。每個(gè)分區(qū)都在多臺(tái)機(jī)器上復(fù)制用于容錯(cuò)葫哗。

Kafka提供的一個(gè)核心概念(也是其實(shí)現(xiàn)過程中使用的數(shù)據(jù)結(jié)構(gòu))是寫前(write ahead)日志文件。這個(gè)日志文件只是一個(gè)保存在磁盤上的將要寫入到cluster的記錄的有序序列球涛。每一個(gè)記錄都被分配了一個(gè)稱為偏移量的序列號(hào)劣针。該偏移量意味著日志文件中的位置。

一個(gè)應(yīng)用使用分區(qū)亿扁,可以被想象成擁有一個(gè)被偏移量標(biāo)記的在日志文件上的位置捺典,這意味所有的記錄都可以被提前讀取,而沒有一個(gè)被滯后从祝。這個(gè)應(yīng)用控制著位置襟己,可以持續(xù)地向前讀取,或者一段時(shí)間后返回重新讀取牍陌。


** 如果將消息保存在磁盤中而不是內(nèi)存中擎浴,Kafka如何輕易地處理每秒數(shù)以千計(jì)的消息呢?**

精心設(shè)計(jì)呐赡!根據(jù)我們的觀察退客,并沒什么特殊的原因遣妥。我們想要的日志文件在線性寫入的情況下并不能像底層文件系統(tǒng)那么快阳啥。底層文件系統(tǒng)在旋轉(zhuǎn)磁盤上有幾百M(fèi)B/s的速度身诺,在固態(tài)磁盤上有GB/s級(jí)的速度猴鲫。為了達(dá)到這么個(gè)速度译荞,Kafka引入了一個(gè)很好的處理辦法本砰,它對(duì)大的線性寫入同時(shí)進(jìn)行很多個(gè)小的批量寫入刨晴。這種批量寫入發(fā)生在消費(fèi)者使用時(shí)薇芝,發(fā)生在復(fù)制時(shí)霹琼,也發(fā)生在操作系統(tǒng)本身务傲。

我認(rèn)為底層結(jié)構(gòu)領(lǐng)域的設(shè)計(jì)在這方面是不同的。應(yīng)用程序開發(fā)者都被警告過過早進(jìn)行優(yōu)化的危害枣申,但是對(duì)于底層結(jié)構(gòu)售葡,我認(rèn)為需要在設(shè)計(jì)階段就開始考慮性能。造成這個(gè)不同的原因是底層結(jié)構(gòu)的基本限制一開始就是知道的忠藤,而且通常系統(tǒng)設(shè)計(jì)不是很靈活挟伙,所以如果你開始的時(shí)候忽略了性能的話,那就很難在你已有的設(shè)計(jì)基礎(chǔ)上進(jìn)行返工優(yōu)化模孩。


** Kafka提供了什么保障尖阔?在什么情況下信息可以被丟棄贮缅?**

Kafka使得那些寫入能夠以相同的順序在N個(gè)設(shè)備中被復(fù)制(N是你選擇的復(fù)制次數(shù)),所以只要其中的一個(gè)設(shè)備的復(fù)制還存在的介却,你的寫入就不會(huì)丟失谴供。

與消費(fèi)者控制他們自己偏移量的方式相結(jié)合,這意味著“至少一次”交付模式齿坷。


** 你提到了Kafka流桂肌,能簡(jiǎn)單解釋一下它是什么以及它為什么有用嗎? **

Kafka流是我們正在使用的Kafka的流處理層胃夏。它與我們現(xiàn)有的流處理框架有一點(diǎn)不同——它更專注于建立流媒體應(yīng)用轴或,一種MapReduce的實(shí)時(shí)版本。
我們將在三月初做一個(gè)預(yù)發(fā)行版仰禀。
結(jié)合我們?cè)贙afka Connect上所做的工作,我們認(rèn)為這將使得Kafka成為一個(gè)真正吸引人的流數(shù)據(jù)平臺(tái)蚕愤。


** 為什么選擇用Java來實(shí)現(xiàn)Kafka答恶?有沒有想過用使用其它的編程語言? **

我們?cè)贘VM語言方面經(jīng)驗(yàn)豐富萍诱,知道可能用它建立一個(gè)快速可靠的底層結(jié)構(gòu)——而且它使用起來比C語言或C++更為方便悬嗓。


** 除了Erlang,還有一些語言像Go和Clojure都在一開始就添加了很好的并發(fā)模塊和semantics裕坊。你是否覺得一個(gè)具有優(yōu)秀并發(fā)模塊語言對(duì)普通的開發(fā)者也是很有用包竹,而不僅僅是只對(duì)框架實(shí)現(xiàn)有用嗎?**

在這里我想點(diǎn)評(píng)一下網(wǎng)絡(luò)協(xié)議中端對(duì)端原理這類東西的命運(yùn)籍凝≈芟梗基本上你在終端上需要解決并發(fā)問題都是在Higher level的,而這會(huì)導(dǎo)致Lower-level的原語產(chǎn)生冗余饵蒂。我看到的現(xiàn)象是每一種語言都試圖為多核程序提供內(nèi)置的原語声诸。但是不像Erlang,我認(rèn)為它們中的大多數(shù)都忽視了分布式計(jì)算的問題退盯。

而發(fā)生改變的是彼乌,現(xiàn)代編程總是在一些在higher level引入了并發(fā)模塊的框架下進(jìn)行。整個(gè)蘋果和安卓的堆棧就是這種框架的例子渊迁,它們具有大量的微服務(wù)框架慰照,以及像Spark或者Kafka Streams這樣的東西。這些higher level的框架能夠很好地工作琉朽,因?yàn)樗麄兛梢詫?duì)環(huán)境進(jìn)行假設(shè)毒租,而在語言層上這是不可能的。例如漓骚,他們中許多都可以引入了一個(gè)模型蝌衔,這個(gè)模型可以同時(shí)解決分散在一個(gè)計(jì)算機(jī)的多個(gè)CPU上的計(jì)算榛泛,也可以解決分散在多個(gè)計(jì)算機(jī)上的計(jì)算。


** 對(duì)于我們這些想要開始學(xué)習(xí)分布式系統(tǒng)的人噩斟,你有什么建議嗎曹锨?有沒有什么書籍、論文或者代碼庫(kù)切實(shí)地幫助你你實(shí)現(xiàn)和設(shè)計(jì)了Kafka剃允?**

我認(rèn)為Martin Kleppman的Designing Data Intensive Applications這本書是一個(gè)很好的開始沛简。我只讀過其中的部分章節(jié),但它是我見過的關(guān)于分布式系統(tǒng)的最容易理解的介紹斥废。遺憾的是椒楣,目前12個(gè)章節(jié)中,只有9個(gè)章節(jié)是可以得到的牡肉,所以我們都要催催他趕緊完成這本書捧灰。

還有一本很好的你現(xiàn)在就可以買到的教科書是Introduction to Reliable and Secure Distributed Programming。這本書并不是非常適合學(xué)習(xí)统锤,但它比其它教科書要好得多毛俏,其它教科書太可怕了。雖然分布式系統(tǒng)的研究已經(jīng)有幾十年了饲窿,但它卻不是真的被廣泛使用煌寇。它好像形成了一種以與主流應(yīng)用相脫節(jié)而自豪的文化。比如說那本教科書逾雄,它用一百多頁(yè)的篇幅介紹不同的可能的通信原語阀溶,談?wù)撍鼈兊男阅埽瑓s沒有涉及到如何將他們與實(shí)際的主流網(wǎng)絡(luò)協(xié)議(比如UDP和TCP)連接起來鸦泳,這讓我很不解银锻。

不過好在如今有了數(shù)以百計(jì)的開源分布式系統(tǒng)可以應(yīng)用,所以你可以從它們的設(shè)計(jì)和實(shí)現(xiàn)過程中學(xué)到很多辽故。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末徒仓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子誊垢,更是在濱河造成了極大的恐慌掉弛,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喂走,死亡現(xiàn)場(chǎng)離奇詭異殃饿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芋肠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門乎芳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事奈惑】跃唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵肴甸,是天一觀的道長(zhǎng)寂殉。 經(jīng)常有香客問我,道長(zhǎng)原在,這世上最難降的妖魔是什么友扰? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮庶柿,結(jié)果婚禮上村怪,老公的妹妹穿的比我還像新娘。我一直安慰自己浮庐,他們只是感情好甚负,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著审残,像睡著了一般腊敲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上维苔,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音懂昂,去河邊找鬼介时。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凌彬,可吹牛的內(nèi)容都是我干的沸柔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼铲敛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼褐澎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伐蒋,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤工三,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后先鱼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俭正,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年焙畔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掸读。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖儿惫,靈堂內(nèi)的尸體忽然破棺而出澡罚,到底是詐尸還是另有隱情,我是刑警寧澤肾请,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布留搔,位于F島的核電站,受9級(jí)特大地震影響筐喳,放射性物質(zhì)發(fā)生泄漏催式。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一避归、第九天 我趴在偏房一處隱蔽的房頂上張望荣月。 院中可真熱鬧,春花似錦梳毙、人聲如沸哺窄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萌业。三九已至,卻和暖如春奸柬,著一層夾襖步出監(jiān)牢的瞬間生年,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工廓奕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抱婉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓桌粉,卻偏偏與公主長(zhǎng)得像蒸绩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铃肯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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