Kafka生產者訊息分割槽機制原理剖析

2021-10-03 18:43:05 字數 2002 閱讀 1588

目錄

1.kafka簡單介紹

2.kafka 生產者的分割槽策略

kafka 是一種分布式的訊息引擎系統,它的主要功能是提供一套完備的訊息發布與訂閱解決方案。在 kafka 中,發布訂閱的物件是主題(topic),向主題發布訊息的客戶端應用程式稱為生產者(producer),而訂閱這些主題訊息的客戶端應用程式就被稱為消費者(consumer)。生產者和消費者統稱為客戶端(clients)。kafka 的伺服器端由被稱為broker的服務程序構成,即乙個 kafka 集群由多個 broker 組成,broker 負責接收和處理客戶端傳送過來的請求,以及對訊息進行持久化。

kafka在儲存訊息時,會將每個主題劃分成多個分割槽每個分割槽是一組有序的訊息日誌。生產者生產的每條訊息只會被傳送到乙個分割槽中,每個分割槽下可以配置若干個副本,其中只能有 1 個領導者副本和 n-1 個追隨者副本。生產者向分割槽寫入訊息,每條訊息在分割槽中的位置資訊由乙個叫位移(offset)的資料來表徵。

kafka 的三層訊息架構

第一層是主題層,每個主題可以配置 m 個分割槽,而每個分割槽又可以配置 n 個副本。

第二層是分割槽層,每個分割槽的 n 個副本中只能有乙個是領導者,對外提供服務;其他 n-1 個副本是追隨者副本,只做資料冗餘。

第三層是訊息層,分割槽中包含若干條訊息,每條訊息的位移從 0 開始,依次遞增。客戶端程式只能與分割槽的領導者副本進行互動。

kafka集群如何保證高可用?

kafka broker 是如何持久化資料的?

kafka 使用訊息日誌(log)來儲存資料,在 kafka 底層,乙個日誌又近一步細分成多個日誌段,訊息被追加寫到當前最新的日誌段中,當寫滿了乙個日誌段後,kafka 會自動切分出乙個新的日誌段,並將老的日誌段封存起來,kafka 在後台還有定時任務會定期地檢查老的日誌段是否能夠被刪除,從而實現**磁碟空間的目的。(日誌段(log segment)機制定期地刪除訊息)訊息日誌檔案是乙個只能追加寫訊息的物理檔案。因為只能追加寫入,故避免了緩慢的隨機 i/o 操作,改為效能較好的順序 i/o 寫操作,這也是實現 kafka 高吞吐量特性的乙個重要手段。

kafka 生產者的分割槽策略決定生產者將訊息傳送到哪個分割槽。kafka 提供了預設的分割槽策略,同時也支援自定義分割槽策略。

輪詢策略是 kafka 預設提供的分割槽策略。如果未指定partitioner.class引數,那生產者程式會按照輪詢的方式在主題的所有分區間均勻地「碼放」訊息。輪詢策略它總是能保證訊息最大限度地被平均分配到所有分割槽上。

隨機策略:先計算出該主題總的分割槽數,然後隨機地返回乙個小於它的正整數。

實現隨機策略版的 partition 方法:

listpartitions = cluster.partitionsfortopic(topic);

return threadlocalrandom.current().nextint(partitions.size());

按訊息鍵保序策略:kafka 支援為每條訊息定義訊息鍵 key。一旦訊息被定義了 key,就可以保證同乙個 key 的所有訊息都進入到相同的分割槽裡面,由於每個分割槽下的訊息處理都是有順序的,故這個策略被稱為按訊息鍵保序策略。

實現按訊息鍵保序策略的 partition 方法:

listpartitions = cluster.partitionsfortopic(topic);

return math.abs(key.hashcode()) % partitions.size();

kafka 預設分割槽策略同時實現了兩種策略:如果指定了 key,那麼預設實現按訊息鍵保序策略;如果沒有指定 key,則使用輪詢策略。

生產者分割槽機制

一 分割槽目的 kafka的結構是topic 分割槽 訊息三層結構 topic下的多個分割槽可以部署在不同的伺服器上,實現負載均衡,提高吞吐量。資料的讀寫就是針對分割槽實現的。二 分割槽策略 分割槽策略指的是 生產者將訊息發往哪個分割槽的演算法。輪詢策略 按照分割槽依次傳送資料 隨機策略 按照分割槽...

kafka生產者分割槽策略

kafka生產者 分割槽策略 分割槽的原因 1 方便在集群中擴充套件,每個partition可以通過調整以適應它所在的機器,而乙個topic又 可以有多個partition組成,因此整個集群就可以適應任意大小的資料了 2 可以提高併發,因為可以以partition為單位讀寫了。分割槽的原則 1 指明...

kafka 生產者訊息分發策略

訊息是kafka中最基本的額資料單元,在kafka中,一條訊息由key value兩部分構成,在傳送一條訊息時,我們可以指定這個key,producer會根據key來判斷當前這條訊息應該 路由儲存到哪個partition。預設情況下,kafka採用的是對key進行hash取模計算出分割槽。如果key...