Kafka 基礎知識

wongchaofan發表於2024-06-09

在資料事件流方面,Apache Kafka 是事實上的標準。它是一個由伺服器和客戶端組成的開源分散式系統。Apache Kafka 主要用於構建實時資料流管道。

Apache Kafka 被全球數以千計的領先組織用於高效能資料管道、流分析、資料整合和許多其他重要應用程式。

在本節中,我們將學習所有基礎知識並瞭解各種 Apache Kafka 元件,例如:

  • Kafka 主題

  • Kafka 生產者

  • Kafka 消費者

  • Kafka 消費者組和消費者偏移

  • Kafka 經紀人

  • Kafka 主題複製

  • Zookeeper

  • KRaft 模式

什麼是 Kafka 主題?

Apache Kafka 被全球數以千計的領先組織用於高效能資料管道、流分析、資料整合和許多其他重要應用程式。

主題由其名稱標識。例如,我們可能有一個名為日誌的主題,其中可能包含來自我們應用程式的日誌訊息,還有另一個名為購買的主題,其中可能包含來自我們應用程式的購買資料。

Kafka 主題可以包含任何格式的任何型別的訊息,所有這些訊息的序列稱為資料流。

Kafka 主題中的資料預設在一週後刪除(也稱為預設訊息保留期),此值是可配置的。這種刪除舊資料的機制可確保 Kafka 叢集不會因隨著時間的推移回收主題而耗盡磁碟空間。

什麼是 Kafka 分割槽?

主題被劃分為多個分割槽。單個主題可能有多個分割槽,通常有 100 個分割槽。

主題的分割槽數是在建立主題時指定的。分割槽編號從 到 開始0N-1其中N是分割槽數。下圖顯示了一個包含三個分割槽的主題,每個分割槽的末尾都附加了訊息。

偏移量是 Kafka 在將每條訊息寫入分割槽時為其新增的一個整數值。給定分割槽中的每條訊息都有一個唯一的偏移量。

Kafka 主題示例

一家交通公司想要跟蹤其卡車車隊。每輛卡車都配備了 GPS 定位器,可將其位置報告給 Kafka。我們可以建立一個名為trucks_gps的主題,卡車會向該主題釋出其位置。每輛卡車可以每 20 秒向 Kafka 傳送一條訊息,每條訊息將包含卡車 ID 和卡車位置(緯度和經度)。該主題可以分成適當數量的分割槽,比如 10 個。該主題可能有不同的消費者。例如,一個在儀表板上顯示卡車位置的應用程式或另一個在發生感興趣的事件時傳送通知的應用程式。

什麼是 Kafka 偏移量?

Apache Kafka 偏移量表示訊息在 Kafka 分割槽中的位置。每個分割槽的偏移量編號從開始,0並隨著傳送到特定 Kafka 分割槽的每條訊息而遞增。這意味著 Kafka 偏移量僅對特定分割槽有意義,例如,分割槽 0 中的偏移量 3 並不表示與分割槽 1 中的偏移量 3 相同的資料。

儘管我們知道 Kafka 主題中的訊息會隨著時間的推移而被刪除(如上所示),但偏移量不會被重複使用。它們會以永無止境的序列不斷增加。

Kafka 生產者

使用 Kafka 建立主題後,下一步就是將資料傳送到主題。這就是 Kafka 生產者發揮作用的地方。

Kafka 生產者

將資料傳送到主題的應用程式稱為 Kafka 生產者。應用程式通常整合 Kafka 客戶端庫來寫入 Apache Kafka。幾乎所有當今流行的程式語言(包括 Python、Java、Go 等)都有出色的客戶端庫。

訊息鍵

每個事件訊息包含一個可選的鍵和一個值。

如果生產者未指定金鑰 ( key=null),則訊息將均勻分佈在主題的各個分割槽中。這意味著訊息以迴圈方式傳送(分割槽p0,然後是p1 ,然後是p2,等等...然後返回p0等等...)。

如果傳送了金鑰key != null,則共享同一金鑰的所有訊息將始終傳送並儲存在同一個 Kafka 分割槽中。金鑰可以是任何用於標識訊息的內容 - 字串、數值、二進位制值等。

當需要對共享同一欄位的所有訊息進行訊息排序時,通常使用 Kafka 訊息鍵。例如,在跟蹤車隊中的卡車的場景中,我們希望卡車的資料在單個卡車級別上按順序排列。在這種情況下,我們可以選擇鍵為truck_id。在下面顯示的示例中,ID 為truck_id_123 的卡車的資料將始終進入分割槽p0。

您將在本頁底部瞭解金鑰雜湊的過程(確定哪個金鑰屬於哪個分割槽的過程)。

Kafka 訊息剖析

Kafka 訊息由生產者建立。Kafka 訊息由以下元素組成:

  • Key。Kafka 訊息中的 Key 是可選的,可以為空。Key 可以是字串、數字或任何物件,然後 Key 被序列化為二進位制格式。

  • 。值表示訊息的內容,也可以為空。值的格式是任意的,然後也會序列化為二進位制格式。

  • 壓縮型別。Kafka 訊息可能被壓縮。壓縮型別可以作為訊息的一部分指定。選項包括nonegziplz4snappyzstd

  • 標頭。可以以鍵值對的形式列出可選的 Kafka 訊息標頭。新增標頭以指定有關訊息的後設資料是很常見的,尤其是對於跟蹤而言。

  • 分割槽 + 偏移量。一旦訊息被髮送到 Kafka 主題,它就會收到一個分割槽號和一個偏移量 ID。主題+分割槽+偏移量的組合唯一地標識了該訊息

  • 時間戳。時間戳由使用者或系統新增到訊息中。

Kafka 訊息序列化器

在許多程式語言中,鍵和值都表示為物件,這大大提高了程式碼的可讀性。但是,Kafka 代理希望將位元組陣列作為訊息的鍵和值。將生產者對物件的程式設計表示轉換為二進位制的過程稱為訊息序列化

如下所示,我們有一條包含Integer鍵和String值的訊息。由於鍵是整數,因此我們必須使用IntegerSerializer將其轉換為位元組陣列。對於值,由於它是一個字串,因此我們必須利用StringSerializer

作為 Apache Kafka 的 Java 客戶端 SDK 的一部分,已經存在多個序列化器,例如字串(取代 JSON)、整數、浮點數。其他序列化器可能必須由使用者編寫,但常見的分散式 Kafka 序列化器已經存在,並且由於 Confluent Schema Registry 的存在,可以高效地為JSON-SchemaApache AvroProtobuf等格式編寫。

好奇者:Kafka 訊息金鑰雜湊

Kafka 分割槽器是一種程式碼邏輯,它獲取記錄並確定將其傳送到哪個分割槽。

因此,分割槽器通常會利用 Kafka 訊息鍵將訊息路由到特定主題分割槽。提醒一下,所有具有相同鍵的訊息都將傳送到同一個分割槽。