kafka入門介紹

背景:

當今社會各種應用系統諸如商業、社交、搜索、瀏覽等像信息工廠一樣不斷的生產出各種信息,在大數據時代,我們面臨如下幾個挑戰:

  1. 如何收集這些巨大的信息

  2. 如何分析它

  3. 如何及時做到如上兩點

以上幾個挑戰形成了一個業務需求模型,即生產者生產(produce)各種信息,消費者消費(consume)(處理分析)這些信息,而在生產者與消費者之間,需要一個溝通兩者的橋樑-消息系統。

從一個微觀層面來說,這種需求也可理解為不同的系統之間如何傳遞消息。

Kafka誕生:由 linked-in 開源

kafka-即是解決這類問題的一個框架,它實現了生產者和消費者之間的無縫連接。

kafka-高產出的分佈式消息系統(A high-throughput distributed messaging system)

Kafka特性:它形容自己的設計是獨一無二的,先看一下它有如何過人之處:

  • 快:單個kafka服務每秒可處理數以千計客戶端發來的幾百MB數據。

  • 可擴展性:一個單一集群可作為一個大數據處理中樞,集中處理各種類型業務

  • 持久化:消息被持久化到磁盤(可處理TB數據級別數據但仍保持極高數據處理效率),並且有備份容錯機制

  • 分佈式:著眼於大數據領域,支持分佈式,集群可處理每秒百萬級別消息

  • 實時性:生產出的消息可立即被消費者消費

kafka入門介紹

Kafka的組件:

  • topic:消息存放的目錄即主題

  • Producer:生產消息到topic的一方

  • Consumer:訂閱topic消費消息的一方

  • Broker:Kafka的服務實例就是一個broker

如下圖所示,Producer生產的消息通過網絡發送給Kafka cluster,而Consumer從其中消費消息

kafka入門介紹

Topic 和Partition:

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

(一個主題可以包含多個分區)

kafka入門介紹

我們可以看到,每個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模式工作。

(group的概念只針對於客戶端,如果有多個客戶端定義了多個組時,broker會以pub-scrib的形式將消息發送到每一個group上)

如下圖所示:含兩臺server的集群一共有p0~p3四個Partition,兩個Consumer Group,在Group內部是以queuing的模式消費Partition,在Group之間是以pub-scrib模式消費。

kafka入門介紹

消息順序性:

Kafka是如何確保消息消費的順序性的呢?前面講到過Partition,消息在一個Partition中的順序是有序的,但是Kafka只保證消息在一個Partition中有序,如果要想使整個topic中的消息有序,那麼一個topic僅設置一個Partition即可。


分享到:


相關文章: