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é)到很多辽故。