kafka詳解一、Kafka簡介
背景:
當今社會各種應用係統諸如商業、社交、搜索、瀏覽等像信息工廠一樣不斷的生產出各種信息,在大數據時代,我們麵臨如下幾個挑戰:
- 如何收集這些巨大的信息
- 如何分析它
- 如何及時做到如上兩點
以上幾個挑戰形成了一個業務需求模型,即生產者生產(produce)各種信息,消費者消費(consume)(處理分析)這些信息,而在生產者與消費者之間,需要一個溝通兩者的橋梁-消息係統。
從一個微觀層麵來說,這種需求也可理解為不同的係統之間如何傳遞消息。
Kafka誕生:由 linked-in 開源
kafka-即是解決這類問題的一個框架,它實現了生產者和消費者之間的無縫連接。
kafka-高產出的分布式消息係統(A high-throughput distributed messaging system)
Kafka特性:它形容自己的設計是獨一無二的,先看一下它有如何過人之處:
- 快:單個kafka服務每秒可處理數以千計客戶端發來的幾百MB數據。
- 可擴展性:一個單一集群可作為一個大數據處理中樞,集中處理各種類型業務
- 持久化:消息被持久化到磁盤(可處理TB數據級別數據但仍保持極高數據處理效率),並且有備份容錯機製
- 分布式:著眼於大數據領域,支持分布式,集群可處理每秒百萬級別消息
- 實時性:生產出的消息可立即被消費者消費

Kafka的組件:
- topic:消息存放的目錄即主題
- Producer:生產消息到topic的一方
- Consumer:訂閱topic消費消息的一方
- Broker:Kafka的服務實例就是一個broker
如下圖所示,Producer生產的消息通過網絡發送給Kafka cluster,而Consumer從其中消費消息

Topic 和Partition:
消息發送時都被發送到一個topic,其本質就是一個目錄,而topic由是由一些Partition Logs(分區日誌)組成,其組織結構如下圖所示:

我們可以看到,每個Partition中的消息都是有序的,生產的消息被不斷追加到Partition log上,其中的每一個消息都被賦予了一個唯一的offset值。
Kafka集群會保存所有的消息,不管消息有沒有被消費;我們可以設定消息的過期時間,隻有過期的數據才會被自動清除以釋放磁盤空間。比如我們設置消息過期時間為2天,那麼這2天內的所有消息都會被保存到集群中,數據隻有超過了兩天才會被清除。
Kafka需要維持的元數據隻有一個--消費消息在Partition中的offset值,Consumer每消費一個消息,offset就會加1。其實消息的狀態完全是由Consumer控製的,Consumer可以跟蹤和重設這個offset值,這樣的話Consumer就可以讀取任意位置的消息。
把消息日誌以Partition的形式存放有多重考慮,第一,方便在集群中擴展,每個Partition可以通過調整以適應它所在的機器,而一個topic又可以有多個Partition組成,因此整個集群就可以適應任意大小的數據了;第二就是可以提高並發,因為可以以Partition為單位讀寫了。
分布式:
這些Partitions分布在集群的每一台server上,而每一個Partition在集群中都可以有多個備份,這個備份數量是可配置的。
每個Partition都有一個leader server,而其他備份的server都稱為followers,隻有leader服務器才會處理這個Partition上所有的讀寫請求,而其它followers則被動的複製leader上的數據。如果一個leader掛掉了,followers中的一個服務器則會自動升級為leader。因此,其實集群中的每個服務器都扮演著一個Partition的leader服務器,和其它Partition的follower服務器。
Producers:
Producer可以根據自己的選擇發布消息到一個主題,Producer也可以自己決定把消息發布到這個主題的哪個Partition,當然我們可以選擇API提供的簡單的分區選擇算法,也可以自己去實現一個分區選擇算法。
Consumers:
消息傳遞通常由兩種模式,queuing(隊列)和publish-subscribe (發布-訂閱)
- queuing:每個Consumer從消息隊列中取走一個消息
- pub-scrib:消息被廣播到每個Consumer
Kafka通過提供了一個對Consumer的抽象來同時實現這兩種模式-ConsumerGroup。Consumer實例需要給自己指定一個ConsumerGroup的名字,如果所有的實例都用同一個ConsumerGroup名字,那麼這些Consumer就會以queuing的模式工作;如果所有的實例分別用的不同的ConsumerGroup名字,那麼它們就以public-subscribe模式工作。
如下圖所示:含兩台server的集群一共有p0~p3四個Partition,兩個Consumer Group,在Group內部是以queuing的模式消費Partition,在Group之間是以pub-scrib模式消費。

消息順序性:
Kafka是如何確保消息消費的順序性的呢?前麵講到過Partition,消息在一個Partition中的順序是有序的,但是Kafka隻保證消息在一個Partition中有序,如果要想使整個topic中的消息有序,那麼一個topic僅設置一個Partition即可。
想更深入的了解Kafka請參閱我的另一篇文章:《Kafka設計與原理詳解》
最後更新:2017-04-03 05:39:56