1. 程式人生 > >Kafka 博文索引

Kafka 博文索引

# 博文索引 - [KafkaBroker 簡析](https://www.cnblogs.com/buttercup/p/14398617.html) - [KafkaConsumer 簡析](https://www.cnblogs.com/buttercup/p/14208062.html) - [KafkaProducer 簡析](https://www.cnblogs.com/buttercup/p/14201153.html) - [KafkaMirrorMaker 的不足以及一些改進](https://www.cnblogs.com/buttercup/p/14130406.html) # Kafka 簡介 資料是系統的燃料,系統的效率高低很大程度取決於資料流轉是否及時: - 將資料從生產源頭移動到分析處理終端,這個過程完成得越快,組織的反應就越敏捷。 - 移動工具越是簡單易用,花費在資料移動上的精力就越少,開發者就越能專注於核心業務。

Kafka 是一款為資料整合而生的基於釋出與訂閱的訊息系統`Messaging System`,方便使用者在多系統間實現鬆散耦合的非同步資料傳輸。 Kafka 為訊息提供順序持久化儲存,可按需讀取。並通過叢集部署與冗餘副本保障資料安全並提供效能伸縮能力。

## 核心概念 - 訊息`message`:最基本的資料單元,由位元組陣列組成。訊息可以有一個可選的鍵`key`,鍵也是一個位元組陣列。 - 主題`topic`:訊息通過主題進行分類。主題就好比資料庫的表,或者檔案系統裡的資料夾。 - 分割槽`partition`:一個提交日誌,主題可以被分為若干個分割槽。訊息以追加的方式寫入分割槽尾部,然後以先入先出的順序讀取。 - 偏移`offset`:一個不斷遞增的整數值,在建立訊息時指定。同個分割槽中每個訊息的偏移量都是唯一的。 - 生產者`producer`:建立訊息並將其釋出到一個特定的主題上。 - 消費者`consumer`:訂閱主題並按照訊息生成的順序讀取訊息。
## 訊息分割槽 Kafka 通過分割槽來實現 **資料冗餘** 和 **可伸縮性**:分割槽可以分佈在不同的伺服器上,一個主題可以橫跨多個伺服器,以此來提供比單個伺服器更強大的效能。

要注意,由於一個主題一般包含幾個分割槽,因此無法在整個主題範圍內保證訊息的順序。生產者在預設情況下,會把訊息均衡地分佈到主題的所有分割槽上,而並不關心特定訊息會被寫到哪個分割槽。 為了保證訊息順序可控,可以為同類訊息指定相同的鍵,然後生產者會根據鍵的 **hashmod** 結果選取分割槽,從而保證具有相同鍵的訊息總會被寫到相同的分割槽上。
## 消費者組 每個分割槽只能被分配給一個消費者,然後消費者會按照訊息生成的順序讀取它們。 過程中,消費者會記錄已讀訊息的偏移量,避免重複消費同一條訊息。

訊息系統中常見的通訊模型有兩種: - 訊息佇列`message queue`:**點對點**`point to point`的排他通訊,每條訊息只會被消費一次。 - 釋出/訂閱`pub/sub`:類似廣播通訊,每條訊息可能會被消費多次。


為了同時支援這兩種模式,Kafka 在消費者端引入了 **消費者組群**`counsumer group`這一邏輯概念: - 不同的消費者組群之間彼此互不相關,兩者消費到的訊息是一致的,此時相當於實現了**釋出/訂閱**模型。 - 而同個組群的消費者之間存在互斥關係,每個消費者只能消費部分資料,此時相當於實現了**訊息佇列**模型。
## 叢集 一個獨立的 Kafka 伺服器被稱為 broker,其主要職責有兩個: - 接收來自生產者的訊息,為訊息設定偏移量,並提交訊息到磁碟儲存。 - 為消費者提供服務,對讀取分割槽的請求作出響應,返回已經提交到磁碟上的訊息。

為保證可用性,broker 以叢集的方式部署。每個叢集會自動選舉出一個 controller 負責管理工作,包括將分割槽分配給 broker 和監控 broker。 一個分割槽從屬於一個 broker,該 broker 被稱為分割槽的 leader。 如果分割槽允許多副本`replica`,這些副本會分佈在多個 broker 上,此時會發生分割槽複製`replication`。 這種複製機制為分割槽提供了訊息冗餘,當 leader 失效時分割槽會被其他 broker 接管,相關的消費者和生產者都會重連新的 leader。
## 優勢 - 系統解耦:異構系統可以通過 Kafka 進行通訊,減少系統之間協調與開發成本。 - 模型豐富:通過消費者組的概念,一份資料可以同時支援不同的通訊模型,同能夠滿足不同的應用需求 - 磁碟儲存:Kafka 會將訊息持久化到磁碟,允許訊息積壓並保證資料不會丟失,無需擔心生產與消費速率不匹配的問題。 - 橫向擴充套件:Kafka 通過叢集與分割槽的方式實現了橫向擴充套件,並且可以線上對叢集進行