Kafka:介紹和內部工作原理

展示 Kafka 工作方式的簡單架構。

什麼是 Kafka?爲什麼我們要使用它?它是消息隊列嗎?

• 它是一個 分佈式流處理平臺或分佈式提交日誌

• Kafka 通常用於實時流數據管道,即在系統之間傳輸數據,構建不斷流動的數據轉換系統和構建事件驅動的系統。

• 它確實可以充當消息隊列,但不僅限於此。它可以充當 FIFO 隊列、發佈 / 訂閱消息系統、實時流處理平臺。由於 Kafka 的持久性存儲能力,甚至可以用作數據庫。

那麼從上面的定義中,什麼是分佈式流處理和提交日誌?

• Kafka 作爲一個由一個或多個節點組成的集羣工作,這些節點可以位於不同的數據中心,我們可以將數據 / 負載分佈到 Kafka 集羣中的不同節點,它具有固有的可擴展性、可用性和容錯性。

• Kafka 將數據存儲爲一系列連續的記錄,可以以不同的方法進行處理。

• 當您將數據推送到 Kafka 時,它會將它們附加到記錄流中,就像將日誌附加到日誌文件中一樣。

讓我們開始...

爲了理解這一點,讓我們深入研究關鍵主題:

消息

• 消息是 Kafka 的原子數據單位。

• 您可以推送字符串、整數、不同架構的 JSON 以及其他任何內容,但通常將不同類型的消息推送到不同的主題中。

• 可以使用一個鍵(Key),它只是一些元數據,用於確定目標分區。

主題

• 我們可以將主題視爲 Kafka 中的消息的邏輯類別,它們是相同類型數據的流。

分區

• 這基本上是分片技術,是 Kafka 的擴展能力背後的概念。

• 分區是使消息能夠並行分佈在集羣中的多個代理上的機制。使用這種並行性方法,Kafka 可以同時支持多個消費者和生產者的線性擴展。這種分區方法允許消費者和生產者的線性擴展。

• 當我們將主題的數據拆分爲多個流時,我們稱所有這些較小的流爲該主題的 “分區”。

• 系統的性能還取決於設置分區的方式。

• 消息的偏移量是該消息的數組索引。圖中塊上的數字表示偏移量,第一個塊位於第 0 個偏移量處,最後一個塊位於 (n-1) 個偏移量處。

生產者

  1. 將消息發佈到 Kafka 主題的 Kafka 客戶端。

生產者用於決定將消息發送到哪個分區。根據不同的配置和參數,生產者決定目標分區。

讓我們檢查不同的情況:

  1. 未指定鍵:生產者將隨機決定分區,並嘗試平衡所有分區上的消息總數。

  2. 指定鍵:生產者使用一致性哈希 [1] 將鍵映射到分區。一致性哈希是一種哈希機制,在相同的鍵上始終生成相同的哈希值,它最小化了重新哈希情況下鍵的重新分佈。

  3. 指定分區:您也可以硬編碼目標分區。

  4. 自定義分區邏輯:我們可以根據分區可以決定的一些規則編寫規則。

您可以以 3 種方式將消息發送到 Kafka。

  1. 發送並忘記 — 我們發送消息到 Kafka 代理並忘記它。由於 Kafka 是高可用的,成功的機會很大。

  2. 同步發送 — 您希望等待所有感興趣的消費者完成您希望它們完成的任何操作

  3. 異步發送 — 您不希望等待所有感興趣的消費者完成您希望它們完成的任何操作

我們還可以在將消息發送到代理之前在生產者上配置特性。

爲了獲得更好的性能,我們可以使用 Avro 序列化 / 反序列化器。

消費者

• 消費者以有序的方式從分區中讀取消息。

• 每次消費者讀取一條消息時,它都會將偏移值存儲到 Kafka 或 Zookeeper 上,表示它是消費者讀取的最後一條消息。

• 因此,如果消費者節點崩潰,它可以恢復到上次讀取的位置。此外,如果在任何時候消費者需要回到過去並讀取舊消息,它只需重置偏移位置即可。

輪詢循環:

您可以配置分區分配策略。

  1. 範圍:消費者獲取連續的分區。

  2. 輪詢:輪詢分配器列出了所有可用的分區和所有可用的

消費者

• 消費者以有序的方式從分區中讀取消息。

每次消費者讀取一條消息時,它都會將偏移值存儲到 Kafka 或 Zookeeper 上,表示它是消費者讀取的最後一條消息。

• 因此,如果消費者節點崩潰,它可以恢復到上次讀取的位置。此外,如果在任何時候消費者需要回到過去並讀取舊消息,它只需重置偏移位置即可。

輪詢循環:您可以配置分區分配策略。

  1. 範圍:消費者獲取連續的分區

  2. 輪詢:輪詢分配器列出了所有可用的分區和所有可用的

嘗試在重新平衡時最小化影響,保持大部分分配不變,但允許協作重新平衡批處理大小。我們可以配置每次輪詢調用返回多少條記錄和多少數據。

提交偏移量:

在讀取消息時,我們可以更新消費者的偏移位置,這稱爲提交偏移量。可以啓用自動提交,或者應用程序可以顯式地提交偏移量。這可以同步和異步兩種方式完成。

消費者組

一組消費者一起工作,從一個主題中讀取消息。

1. 扇出交換: 可以由多個消費者組訂閱單個主題。

一個實時示例是 OTP 發送服務,可以在號碼上發送 OTP,也可以發送到電子郵件。

Otp 示例

  1. 訂單保證: 一個分區不能由同一個消費者組中的多個消費者讀取。這由消費者組啓用,只有消費者組中的一個消費者可以從單個分區讀取。

• 在這裏,生產者生成 6 條消息。每條消息都是鍵值對,假設鍵 “A” 的值爲 “1”,“C” 的值爲 “1”,“B” 的值爲 “1”,“C” 的值爲 “2”……“B” 的值爲“2”。

• 我們的主題有 3 個分區,由於一致性哈希,具有相同鍵的消息始終進入同一分區,因此所有鍵爲 “A” 的消息都會在一起分組,鍵爲 B 和 C 的消息也是如此。

• 現在,由於每個分區只有一個消費者,它們只按順序接收消息。因此,消費者將在 A2 之前接收 A1,在 B2 之前接收 B1,因此保持了順序。

• 因此,對於 3 個分區,您可以最多擁有 3 個消費者,如果有 4 個消費者,一個消費者將處於空閒狀態。但對於 3 個分區,您可以有 2 個消費者,然後一個消費者將從一個分區讀取,另一個消費者將從兩個分區讀取。

代理

• 單個 Kafka 服務器。

• 代理接收來自生產者的消息,爲它們分配偏移量,然後將它們提交到分區日誌,基本上是將數據寫入磁盤,這賦予了 Kafka 其持久性特性。

集羣

• 由多個代理節點協同工作以提供可擴展性、可用性和容錯性的集羣。集羣中的一個代理充當控制器,負責將分區分配給代理,

• 當一個分區被複制到 3 個代理時,其中一個代理將充當該分區的領導者,其餘兩個將成爲追隨者。

• 數據始終寫入領導者代理,然後複製到追隨者。通過這種方式,我們既不會丟失數據,也不會丟失集羣的可用性,如果領導者崩潰,將選舉出另一個領導者。

讓我們深入一些編程內容:

  1. 創建一個主題,創建該主題的 5 個分區,並將所有 5 個主題的數據複製到總共 3 個節點。

2.kafka-topics — create — zookeeper zookeeper:2181 — topic applog — partitions 5 — replication-factor 3

Zookeeper

在集羣中多次聽到這個術語,讓我們看看它是什麼?

•Zookeeper 作爲 Kafka 的中央配置和共識管理系統。它跟蹤代理、主題和分區分配、領導者選舉,基本上是有關集羣的所有元數據。

結束語:

Kafka 是一款出色的軟件,具有豐富的功能,可以在各種用例中使用。Kafka 非常適合現代分佈式系統,因爲它是通過設計分佈式的。它最初由 LinkedIn 創建,目前由 Confluent 維護。像 Uber、Netflix、Activision、Spotify、Slack、Pinterest、Coursera 等頂級科技公司都在使用它。我們瞭解了 Kafka 的核心概念,以幫助您入門。還有很多其他東西,比如 Kafka Stream API 或 kSql,由於時間有限,我們沒有討論。

參考資料:

1.《Kafka 權威指南》(其中一些圖片來自此處)

2.https://www.confluent.io/blog/apache-kafka-intro-how-kafka-works/[2]

感謝閱讀!

引用鏈接

[1] 一致性哈希: https://www.toptal.com/big-data/consistent-hashing?ref=hackernoon.com
[2] https://www.confluent.io/blog/apache-kafka-intro-how-kafka-works/: https://www.confluent.io/blog/apache-kafka-intro-how-kafka-works/?ref=hackernoon.com

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/bfjYTCj1FjNcBgwjgFQVdw