Kafka 系列學習筆記(一)介紹

2021-09-25 15:04:43 字數 2849 閱讀 8838

之前在學習 fabric 有關內容的時候,就了解到在 fabric 中的 orderer 節點中是需要借助 kafka 進行訊息序列排序的,而且在現在,很多做架構的都在使用 kafka 。今天有時間來看一下,看一看到底 kafka 有多強大。

首先我們要了解的是 kafak 的一些基本概念,在官方文件中,他提及到三點:

在 kafka 當中有主要四個 api,我們分別來說一下:

在這裡面,我們應該始終記得,topic 是始終存在於 kafka cluster 中的。

在 kafka 中,客戶端和伺服器均使用的是乙個簡單、高效能、支援多語言的 tcp協議。而且, kafka 提供了多種語言的客戶端,對於 go 語言,kafka 也提供了很多的參考。

現在我們來說一下 kafka 的核心概念: topic

topic 就是資料的主題,是資料記錄以及發布的地方,可以用來區分業務系統。kafka 中的 topics 總是多訂閱者模式,也就是說乙個 topic 可以擁有乙個或者多個消費者來訂閱它的資料。這一點在前面的主要特徵和 api 中都有提到過。

對於每乙個 topic,kafka 都會維持乙個分割槽日誌,如下圖所示:

每個分割槽都是有序的,並且順序不可變(感覺和區塊鏈中的交易很像),而且還會不斷地追加到結構化的 commit log 檔案中。分割槽的每乙個記錄都會分配乙個 id 號來表示順序,稱之為 offset,這個 offset 用來標識分割槽中的每一條記錄。

kafka 在集群中保留所有發布的記錄,並通過乙個可以配置的引數來控制其保留的期限。也就說,如果我們將時間引數設定為2天,那麼我們在這兩天內可以隨時消費這幾條資料,但一旦過了兩天之後,這條記錄則會被丟棄並且釋放磁碟空間。而 kafka 本身是和資料大小無關的,因此 kafka 對於資料儲存的時間是沒有什麼明確限制的。

事實上,在每乙個消費者中唯一儲存的元資料是 offset 量,也就是消費在日誌中的位置。而這個偏移量是由消費者所控制的:通常在讀取記錄後,消費者會以線性的方式增加偏移量,但是實際上,由於這個位置由消費者控制,所以消費者可以採用任何順序來消費記錄。例如,乙個消費者可以重置到乙個舊的偏移量,從而重新處理過去的資料;也可以跳過最近的記錄,從"現在"開始消費。

而這一點也同樣說明消費者的增加和減少是對集群或者其他消費者來說沒有太大影響的。比如,你可以使用命令列工具,對一些 topic 內容執行 tail 操作,並不會影響已存在的消費者消費資料。

在日誌當中還有乙個 partition ,這個 partition 有以下幾個用途:

日誌在經過分割槽後是分布在 kafka 集群的伺服器上的。每個伺服器在處理資料和請求時,都會共享這些分割槽。而每乙個分割槽都會在已配置的伺服器上進行備份,以確保容錯性。

在每個分割槽中都有一台 server 作為整個分割槽的 leader,而與 leader 相對應的 follower 的個數是從 0

m0~m

0m間任取的。 leader 負責處理對 partition 的讀寫請求,而 followers 只需要被動的同步 leader 上的資料即可。當 leader 發生故障,followers 中的一台伺服器將會自動成為新的 leader。而對於 leader 和 follower 的選擇來說,每一台 server 的成為 server 和 follower 的可能性是相等的,因此集群的負載是平衡的。

生產者可以將資料發布到所選擇的 topic 當中。而消費者則使用乙個 消費組 名稱來進行標識,發布到 topic 中的每條記錄將被分配給訂閱消費組中的消費者。而消費者可以分布在多個程序中或者多個機器上。

如果所有的消費者例項在同一消費組中,訊息記錄會負載平衡到每乙個消費者例項。

但如果所有的消費者是存在於不同的消費組中的,每條訊息記錄將會廣播到所有的消費者程序。

在這裡要宣告一點的是,前面所提到的 訂閱者 的概念,並不是針對某乙個消費者而言的,更通俗的說,這個訂閱者是針對整個消費組而言的。

在 kafka 中實現消費的方式是將日誌中的分割槽劃分到每乙個消費者例項上,這樣以便在任何時間,每個例項都是分割槽唯一的消費者。維護消費組中的消費關係由 kafka 協議動態處理。如果新的例項加入組,他們將從組中其他成員處接管一些 partition 分割槽;如果乙個例項消失,擁有的分割槽將被分發到剩餘的例項。但同時還要注意,kafka 只保證分區內的記錄是有序的,而不保證主題中不同分割槽的順序。

kafka 整體將給予以下幾點保證:

許多訊息佇列可以發布訊息,除了消費訊息之外還可以充當中間資料的儲存系統。那麼 kafka 作為乙個優秀的儲存系統有什麼不同呢? 資料寫入 kafka 後被寫到磁碟,並且進行備份以便容錯。直到完全備份,kafka 才讓生產者認為完成寫入,即使寫入失敗 kafka 也會確保繼續寫入。而且 kafka 使用磁碟結構,具有很好的擴充套件性— 50kb 和 50tb 的資料在 server 上表現是一致的。

正如官方文件所述:kafka 可以儲存大量資料,並且可通過客戶端控制它讀取資料的位置,您可認為 kafka 是一種高效能、低延遲、具備日誌儲存、備份和傳播功能的分布式檔案系統。

像 hdfs 這樣的分布式檔案系統可以儲存用於批處理的靜態檔案。 乙個系統如果可以儲存和處理歷史資料是非常不錯的。

傳統的企業訊息系統允許處理訂閱後到達的資料。以這種方式來構建應用程式,並用它來處理即將到達的資料。

kafka結合了上面所說的兩種特性。作為乙個流應用程式平台或者流資料管道,這兩個特性,對於kafka 來說是至關重要的。

通過組合儲存和低延遲訂閱,流式應用程式可以以同樣的方式處理過去和未來的資料。 乙個單一的應用程式可以處理歷史記錄的資料,並且可以持續不斷地處理以後到達的資料,而不是在到達最後一條記錄時結束程序。 這是乙個廣泛的流處理概念,其中包含批處理以及訊息驅動應用程式。

同樣,作為流資料管道,能夠訂閱實時事件使得 kafk 具有非常低的延遲; 同時 kafka 還具有可靠儲存資料的特性,可用來儲存重要的支付資料, 或者與離線系統進行互動,系統可間歇性地載入資料,也可在停機維護後再次載入資料。

參考:

Linq系列學習(一)介紹

一 linq簡介 linq是.net framework 3.5的新特性,其全稱是 language integrated query 語言整合查詢 是指將 查詢功能和語言 結合起來。從而為我們提供一種統一的方式,讓我們能在c 或vb.net語言中直接查詢和操作各種資料 二 linq作用 1 在.n...

RabbitMQ學習系列(一) 介紹

1.介紹 rabbitmq是乙個由erlang開發的基於amqp advanced message queue 協議的開源實現。用於在分布式系統中儲存 訊息,在易用性 擴充套件性 高可用性等方面都非常的優秀。是當前最主流的訊息中介軟體之一。rabbitmq的官網 2.amqp amqp,是應用層協議...

RabbitMQ學習系列(一) 介紹

1.介紹 rabbitmq是乙個由erlang開發的基於amqp advanced message queue 協議的開源實現。用於在分布式系統中儲存 訊息,在易用性 擴充套件性 高可用性等方面都非常的優秀。是當前最主流的訊息中介軟體之一。rabbitmq的官網 2.amqp amqp,是應用層協議...