Apache Kafka

Apache Kafka是一個開源訊息系統項目,由Scala寫成。該項目的目標是為處理實時數據提供一個統一、高通量、低等待的平台。

簡介,相關術語,主題與日誌,

簡介

Apache Kafka是由Apache軟體基金會開發的一個開源訊息系統項目,由Scala寫成。Kafka最初是由LinkedIn開發,並於2011年初開源。2012年10月從Apache Incubator畢業。該項目的目標是為處理實時數據提供一個統一、高通量、低等待的平台。
Kafka是一個分散式的、分區的、多複本的日誌提交服務。它通過一種獨一無二的設計提供了一個訊息系統的功能。

相關術語

1)Kafka維護按類區分的訊息,稱為主題(topic)
2)生產者(producer)向kafka的主題發布訊息
3)消費者(consumer)向主題註冊,並且接收發布到這些主題的訊息
4)kafka以一個擁有一台或多台伺服器的集群運行著,每一台伺服器稱為broker
從高層來說,生產者(producer)通過網路發訊息到kafka集群,而kafka集群則以下面這種方式對消費者進行服務。

主題與日誌

主題(topic)是kafka提供的高層抽象。
一個主題就是一個類別或者一個可訂閱的條目名稱。對每個topic來說,kafka維護的是如圖所示的一個分區日誌(partitioned log):
每個分區(partition)是一個有序的、不可變的訊息序列,這個序列可以被連續地追加—— 一個提交日誌。在分區內的每條訊息都有一個有序的id號,這個id號被稱為偏移(offset),這個偏移量可以唯一確定每條訊息在分區內的位置。
Kafka集群可以在一個指定的時間內保持所有發布上來的訊息,不管這些訊息有沒有被消費。打個比方,如果這個時間設定為兩天,那么在訊息發布的兩天以內,這條訊息都是可以被消費的,但是在兩天后,這條訊息就會被系統丟棄以釋放空間。Kafka的性能不會受數據量的大小影響,因此保持大量的數據不是一個問題。
事實上,每個消費者(consumer)唯一需要保存的元數據就是它已經消費到日誌里的哪一個位置了,這個位置就是前面提到的偏移量offset)。這個偏移量是由消費者控制的:一般來說,消費者會按順序去一條條讀日誌里的訊息,但是如果需要的話,它也是可以重新設定它開始讀的位置的。
這些特點的組合意味著消費者(consumer)是很輕量的——它們可以不影響系統性能的情況下來去自如。打個比方,你可以用我們的命令行工具在不影響其他消費者的情況下去抓取任何一個主題的內容。
日誌里的分區設計有多個目的。首先,這可以使日誌的規模擴大到單獨一台機子所能容納的數量之外。每個單獨的分區必須和它所在的主機相匹配,但是一個主題(topic)可以有許多分區,這樣的話它就可以處理任意數量的數據。其次這些分區可以作為並行的一個單元——更多的內容稍後會講到。
分散式(Distributed)
日誌的分區分布在kafka集群的多台伺服器上,每台伺服器保存數據以及對每個分區數據的請求。每個分區會在多台伺服器上進行副本備份以便容錯,副本的數量是可配置的。
每個分區分有一個“leader”的伺服器,剩下的都是“follower”。leader處理對這個分區的所有讀寫請求,與此同時,follower會被動地去複製leader上的數據。如果leader發生故障,其中一個follower會自動成為新的leader。每台伺服器可以作為一些分區的leader,同時也作為其他一些分區的follower,這樣在集群內部就可以做到一個很好的負載均衡。
生產者(Producer)
生產者(producer)可以根據具情況將訊息發布(publish)到一個主題(topic)上。生產者可以選擇將哪條訊息發布到這個主題下的某一個分區(partition)。這可以用傳統的輪詢方式以保證負載均衡,也可以根據一些語義分區函式來做。更多的有關分區的內容後面會講到。
消費者(consumer)
傳統的訊息系統有兩種模型:佇列和發布-訂閱模式。在佇列模型中,一堆消費者會從一台機子上讀訊息,每一條訊息只會被一個消費者讀到;在發布訂閱模型中,訊息會向所有的消費者廣播。Kafka提供了一種單一的將這兩種模型進行抽象的消費者模式——消費者組(consumer group)。
消費者會屬於某一個組,發布到每個主題的訊息會遞送給訂閱了這個主題的消費者組中的一個消費者。消費者實例可以是不同的進程或者在不同的機器上。如果所有的消費者從屬於同一個組,這就跟傳統的佇列模式一樣了。如果每個消費者自成一組,那么這就是發布訂閱模式了,所有的訊息會被廣播給所有的消費者。但是通常情況下,我們發現,主題會有多個消費者組,每個組對應一個邏輯上的訂閱者,每個組由多個消費者實例組成以保證擴展性和容錯性。
Kafka處理定序問題上也去傳統的訊息系統不一樣。傳統的佇列允許訊息被任何一個消費者實例所消費。這意味著訊息的順序丟失了。也就是說,儘管在佇列中訊息是有順序的,但這些訊息會到達不同的消費者並且被無序地處理。在Kafka里,因為有並行的概念——分區,Kafka可以同時提供順序保證和負載均衡。這可以通過將主題中的分區分配給消費者組中的消費者來實現,這樣的話每個分區只被這個組中的一個消費者所消費。這樣我們還可以保證這個消費者是這個分區的唯一消費者,並且是按原來的順序來處理數據的。因為有許多分區,所以也就可以在多個消費者實例中實現負載均衡。需要注意的是,消費者實例的數量不可能比分區多。
保證(Guarantees)
Kafka給出了以下保證:
1)由生產者傳送給特定主題分區的訊息會以傳送的順序追加(appended)。也就是說,如果一條訊息M1被同一個生產者以M2來傳送,並且M1先發,那么M1的offset就會比M2更小,並且先出現在日誌中。
2)一個消費者實例會按訊息在日誌中的存儲順序看到它們。
3)對於副本因子為N的主題,我們可以承受N-1個伺服器發生故障而保證提交到日誌的訊息不會丟失。

相關詞條

熱門詞條

聯絡我們