初識Kafka

2023-03-23 12:08:01

介紹 Kafka

Kafka 是一款基於釋出與訂閱的訊息系統。

用生產者使用者端 API 向 Kafka 生產訊息,用消費者使用者端 API 從 Kafka 讀取這些訊息。

Kafka 使用 Zookeeper 儲存後設資料資訊。

  • Kafka 0.9 版本之前,除了 broker 之外, 消費者也會使用 Zookeeper 儲存一些資訊,比如消費者群組的資訊、 主題資訊、消費分割區的偏移量(在消費者群組裡發生失效轉移時會用到)。
  • 到了 0.9.0.0 版本, Kafka 引入了一個新的消費者介面,允許 broker 直接維護這些資訊。

Kafka 中的概念

訊息 & 批次

Kafka 的資料單元被稱為訊息。訊息就好比資料庫裡的一個「資料行」或一條「記錄」。訊息由位元組陣列組成,所以對於 Kafka 來說,訊息裡的資料沒有特別的格式或含義。

訊息可以有個可選的後設資料,也就是鍵。鍵也是一個位元組陣列,與訊息一樣,對於 Kafka 來說也沒有特殊的含義。鍵有兩個用途:可以作為訊息的附加資訊,也可以用來決定訊息該被寫到主題的哪個分割區。最簡單的例子就是為鍵生成一個一致性雜湊值,然後使用雜湊值對主題的分割區數進行取模,為訊息選取分割區。


為了提高效率,訊息被分批次寫入 Kafka。批次就是一組訊息,這些訊息屬於同一主題和分割區。

如果每一個訊息都單獨序列於網路,會導致大量的網路開銷,把訊息分批次傳輸可以減少網路開銷。不過,這要在時間延遲和吞吐量之間作出權衡:批次越大,單位時間內處理的訊息就越多,單個訊息的傳輸時間就越長。

批次資料會被壓縮,這樣可以提升資料的傳輸和儲存能力,但要做更多的計算處理。

主題 & 分割區

Kafka 的訊息通過主題進行分類。主題就好比資料庫的表,或者檔案系統裡的資料夾。

主題可以被分為若干個分割區,一個分割區就是一個提交紀錄檔。訊息以追加的方式寫入分割區,然後以先進先出的順序讀取。要注意,由於一個主題一般包含幾個分割區,因此無法在整個主題範圍內保證訊息的順序,但可以保證訊息在單個分割區內的順序。

Kafka 通過分割區來實現資料冗餘和伸縮性。分割區可以分佈在不同的伺服器上,也就是說, 一個主題可以橫跨多個伺服器,以此來提供比個伺服器更強大的效能。

Kafka 叢集通過分割區對主題進行橫向擴充套件,所以當有新的 broker 加入叢集時,可以通過分割區個數來實現叢集的負載均衡。擁有大量訊息的主題如果要進行負載分散,就需要大量的分割區。

生產者 & 消費者

Kafka 的使用者端就是 Kafka 系統的使用者,Kafka 的使用者端被分為兩種基本型別生產者和消費者。除此之外,還有其他高階使用者端 API:用於資料整合的 Kafka Connect API 和用於流式處理的 Kafka Streams 。這些高階使用者端 API 使用生產者和消費者作為內部元件,提供了高階的功能。


生產者

生產者建立訊息。在其他基於釋出與訂閱的訊息系統中,生產者可能被稱為釋出者 或 寫入者。

一般情況下,一個訊息會被髮布到一個特定的主題上。生產者在預設情況下把訊息均衡地分佈到主題的所有分割區上,而並不關心特定訊息會被寫到哪個分割區。不過,在某些情況下,生產者會把訊息直接寫到指定的分割區。這通常是通過訊息鍵和分割區器來實現的,分割區器為鍵生成一個雜湊值,並將其對映到指定的分割區上。這樣可以保證包含同一個鍵的訊息會被寫到同一個分割區上。生產者也可以使用自定義的分割區器,根據不同的業務規則將訊息對映到分割區。


消費者

消費者讀取訊息。在其他基於釋出與訂閱的訊息系統中,消費者可能被稱為訂閱者 或 讀者。

消費者訂閱一個或多個主題,並按照訊息生成的順序讀取它們。消費者通過檢查訊息的偏移量來區分已經讀取過的訊息。

偏移量是另一種後設資料,它是一個不斷遞增的整數值,在建立訊息時, Kafka 會把偏移量新增到訊息裡。在給定的分割區裡,每個訊息的偏移量都是唯一的。消費者把每個分割區最後讀取的訊息的偏移量儲存在 Zookeeper 或 Kafka 上,如果消費者關閉或重啟,它的讀取狀態不會丟失。


消費者群組

消費者是消費者群組的一部分。一個群組裡的消費者訂閱的是同一個主題,每個消費者接收主題一部分分割區的訊息。消費者群組保證每個分割區只能被一個消費者使用 。消費者與分割區之間的對映通常被稱為消費者對分割區的所有權關係。

通過消費者群組的方式,消費者可以消費包含大量訊息的主題。而且,如果一個消費者失效,消費者群組裡的其他消費者可以接管失效消費者的工作。

broker & 叢集

一個獨立的 Kafka 伺服器被稱為 broker。

  • broker 接收來自生產者的訊息,為訊息設定偏移量,並提交訊息到磁碟儲存。
  • broker 為消費者提供服務,對讀取分割區的請求作出響應,返回已經提交到磁碟上的訊息。

根據特定的硬體及其效能特徵,單個 broker 可以輕鬆處理數千個分割區以及每秒百萬級的訊息量。


broker 是叢集的組成部分。每個叢集都有一個 broker 同時充當了叢集控制器的角色(叢集控制器自動從叢集的活躍成員中選舉出來)。叢集控制器負責管理工作,包括將分割區分配給 broker 和監控 broker。在叢集中,一個分割區從屬於一個 broker,該 broker 被稱為分割區的首領。一個分割區可以分配給多個 broker,這個時候會發生分割區複製。這種複製機制為分割區提供了訊息冗餘,如果有一個 broker 失效,其他 broker 可以接管領導權。不過,相關的消費者和生產者都要重新連線到新的首領。


保留訊息(在一定期限內)是 Kafka 的一個重要特性。訊息被提交到磁碟,Kafka 根據設定的保留規則進行儲存。主題可以設定自己的保留策略,將悄息保留到不再使用它們為止。 Kafka 有兩種保留規則:

  • 根據時間保留資料:根據時間保留資料是通過檢查磁碟上紀錄檔片段檔案的最後修改時間來實現的。一般來說,最後修改時間指的就是紀錄檔片段的關閉時間,也就是檔案裡最後一個訊息的時間戳。當前時間超過磁碟上紀錄檔片段檔案的最後修改時間,超過的時間達到設定引數指定的值,那麼舊訊息就會過期並被刪除。
  • 根據訊息的位元組數保留資料:當單個主題中所有訊息的位元組數達到設定引數指定的值,那麼舊訊息就會過期並被刪除。所以在任何時刻,可用訊息的總量都不會超過設定引數所指定的大小。

參考資料

《Kafka權威指南》第1章:初識Kafka