Kafka生產者消息分區機制原理剖析

目錄

 

1.kafka簡單介紹

2.Kafka 生產者的分區策略


1.kafka簡單介紹

Kafka 是一種分佈式的消息引擎系統,它的主要功能是提供一套完備的消息發佈與訂閱解決方案。在 Kafka 中,發佈訂閱的對象是主題(Topic),向主題發佈消息的客戶端應用程序稱爲生產者(Producer),而訂閱這些主題消息的客戶端應用程序就被稱爲消費者(Consumer)。生產者和消費者統稱爲客戶端(Clients)。Kafka 的服務器端由被稱爲 Broker 的服務進程構成,即一個 Kafka 集羣由多個 Broker 組成,Broker 負責接收和處理客戶端發送過來的請求,以及對消息進行持久化。

kafka在儲存消息時,會將每個主題劃分成多個分區每個分區是一組有序的消息日誌。生產者生產的每條消息只會被髮送到一個分區中,每個分區下可以配置若干個副本,其中只能有 1 個領導者副本和 N-1 個追隨者副本。生產者向分區寫入消息,每條消息在分區中的位置信息由一個叫位移(Offset)的數據來表徵。

Kafka 的三層消息架構

  1. 第一層是主題層,每個主題可以配置 M 個分區,而每個分區又可以配置 N 個副本。
  2. 第二層是分區層,每個分區的 N 個副本中只能有一個是領導者,對外提供服務;其他 N-1 個副本是追隨者副本,只做數據冗餘。
  3. 第三層是消息層,分區中包含若干條消息,每條消息的位移從 0 開始,依次遞增。客戶端程序只能與分區的領導者副本進行交互。

kafka集羣如何保證高可用?

  • 將不同的 Broker 分散運行在不同的機器上,這樣如果集羣中某一臺機器宕機,即使在它上面運行的所有 Broker 進程都掛掉了,其他機器上的 Broker 也依然能夠對外提供服務。
  • 備份機制(Replication)Kafka 定義了兩類副本:領導者副本(Leader Replica)和追隨者副本(Follower Replica)。領導者副本主要負責與客戶端程序進行交互;而追隨者副本只是被動地追隨領導者副本而已,不能與外界進行交互。即生產者總是向領導者副本寫消息;而消費者總是從領導者副本讀消息。對於追隨者副本,它只負責向領導者副本發送請求,請求領導者把最新生產的消息發給它,這樣它能保持與領導者的同步。

Kafka Broker 是如何持久化數據的?

Kafka 使用消息日誌(Log)來保存數據,在 Kafka 底層,一個日誌又近一步細分成多個日誌段,消息被追加寫到當前最新的日誌段中,當寫滿了一個日誌段後,Kafka 會自動切分出一個新的日誌段,並將老的日誌段封存起來,Kafka 在後臺還有定時任務會定期地檢查老的日誌段是否能夠被刪除,從而實現回收磁盤空間的目的。(日誌段(Log Segment)機制定期地刪除消息)消息日誌文件是一個只能追加寫消息的物理文件。因爲只能追加寫入,故避免了緩慢的隨機 I/O 操作,改爲性能較好的順序 I/O 寫操作,這也是實現 Kafka 高吞吐量特性的一個重要手段。

 

2.Kafka 生產者的分區策略

Kafka 生產者的分區策略決定生產者將消息發送到哪個分區。Kafka 提供了默認的分區策略,同時也支持自定義分區策略。

  • 輪詢策略:即順序分配。比如一個主題下有 3 個分區,那麼第一條消息被髮送到分區 0,第二條被髮送到分區 1,第三條被髮送到分區 2,以此類推。當生產第 4 條消息時又會重新開始,即將其分配到分區 0。

輪詢策略是 Kafka 默認提供的分區策略。如果未指定partitioner.class參數,那生產者程序會按照輪詢的方式在主題的所有分區間均勻地“碼放”消息。輪詢策略它總是能保證消息最大限度地被平均分配到所有分區上。

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

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


List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return ThreadLocalRandom.current().nextInt(partitions.size());

按消息鍵保序策略:Kafka 支持爲每條消息定義消息鍵 Key。一旦消息被定義了 Key,就可以保證同一個 Key 的所有消息都進入到相同的分區裏面,由於每個分區下的消息處理都是有順序的,故這個策略被稱爲按消息鍵保序策略。

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


List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return Math.abs(key.hashCode()) % partitions.size();

Kafka 默認分區策略同時實現了兩種策略:如果指定了 Key,那麼默認實現按消息鍵保序策略;如果沒有指定 Key,則使用輪詢策略。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章