1. 程式人生 > >分散式訊息中介軟體(六)——Kafka核心元件詳解

分散式訊息中介軟體(六)——Kafka核心元件詳解

一、Kafka釋出訂閱訊息系統基礎

     Kafka 是分散式釋出-訂閱訊息系統。它最初由 LinkedIn 公司開發,使用 Scala語言編寫,之後成為 Apache 頂級專案框架。Kafka 是一個分散式的,可劃分的,多訂閱者,冗餘備份的永續性的服務。

Kafka生態架構實戰中已經介紹了Kafka生態系統,伴隨大資料計算,kafka作為重要的資料緩衝者,將flume收集的資料緩衝,提供給storm進行實時計算。同於storm框架,針對實時性、流式計算系統也是kafka的主要應用。它主要用於處理活躍的流式資料。

二、Kafka的特點

1、同時為釋出和訂閱提供高吞吐量。統計Kafka 每秒可以生產約 25 萬訊息(50 MB),每秒處理 55 萬訊息(110 MB)。

2、可持久化操作。將訊息持久化到磁碟,因此可用於批量消費,通過將資料持久化到硬碟以及 replication 防止資料丟失。

3、分散式系統,易於向外擴充套件。所有的 producer、broker 和 consumer 都會有多個,均為分散式的。無需停機即可擴充套件機器。

4、kafka每個例項(broker)是無狀態的,只管訊息的增減,不管誰來消費,訊息被處理的狀態是由consumer主動從topic分割槽中pull訊息,也就是說訊息由誰消費由 consumer 決定,而不是由 server的broker決定。

三、Kafka效能測試  

 

     資料大量堆積導致broker卡死,這裡就將使用到topic的分割槽,分散broker中的日誌儲存大小。

四、Kafka核心

1、Kafka核心元件

     Producer:訊息的生產者

Consumer:特指訊息的消費者

Consumer Group:消費者組,可以並行消費Topic中partition的訊息

Broker:快取代理,Kafa 叢集中的一臺或多臺伺服器統稱為 broker。

Topic:特指 Kafka 處理的訊息源(feeds of messages)的不同分類。

Partition:Topic 物理上的分組,一個 topic 可以分為多個 partition,每個 partition 是一個有序的佇列。partition 中的每條訊息都會被分配一個有序的 id(offset)。 Message:訊息,是通訊的基本單位,每個 producer 可以向一個 topic(主題)釋出一些訊息。

Producers:訊息和資料生產者,向 Kafka 的一個 topic 釋出訊息的過程

Consumers:訊息和資料消費者,訂閱 topics 並處理其釋出的訊息的過程

2、Kafka訊息流程


(1)訊息生產者Producer將訊息傳送到kafka broker 的Topic中(每個topic中有多個訊息)

(2)每個topic中訊息增多,topic中的訊息進行分割槽,使得consumer可快速定位消費訊息,也可同時消費多個分割槽中的資料,提高了傳輸速率。

(3)Consumer Group:消費者組裡有多個消費者,每個消費者對應著不同partition分割槽中的資料處理。例如partition1的資料給Consumer 1,2給2,使得多個分割槽組成的topic由group中的多個consumer消費,也就是資料內部對相同message的併發處理。

3、核心元件分析

Producers

(1)訊息生產者向kafka的一個topic中分佈訊息的過程kafka稱為Producers

(2)變相的負載均衡:把訊息發給topic的哪個partition裡,實現對訊息的均衡分發

(3)批量非同步傳送:producer和broker 兩端(訊息的客戶端和服務端),不在一臺伺服器中,如果每產生一條訊息就進行傳送,建立一次網路連線,勢必影響效率。Kafka的訊息傳送過程採取批量,非同步傳送。

Broker

(1)支援訊息持久化:Broker沒有副本備份,但kafka將訊息進行持久化操作,以免丟失。當Consumer到kafka的broker中獲取資料時,broker不會直接給consumer消費,而是把資料先儲存到broker本地日誌檔案中(具體路徑可配),每個Partition都會有一個log檔案。另外日誌的新增採用追加方式進行持久化,達到一個訊息有序持久化效果。寫入日誌檔案:快取到一定閾值之後,再讀寫磁碟進行IO操作,提高效能

(2)誰消費了message,由消費者確定和維護這類資訊(具體有zookeeper記錄維護),broker不儲存。

(5)消費時發生故障,kafka可快速定位到故障時沒消費的那條資料。 consumer如何確定哪些訊息是它沒有消費的?zk來記錄哪條訊息消費情況,如何快速的找到沒有消費的訊息就涉及到kafka的稀疏索引機制。接下來再繼續研究。

Messge

訊息的3個屬性: 

(1)Offset  偏移量   訊息的唯一標識,通過該標識找到訊息。

(2)MessageSize 訊息大小

(3)data   訊息本身

Partition

分割槽的目的:

(1)減緩日誌檔案佔用磁碟空間

大量訊息,broker都要持久化到檔案中,硬碟佔用空間增大。分割槽將訊息顆粒細分,每個partition可以存放在不同的硬碟空間中,避免單個broker中的topic檔案侵佔記憶體空間

(2)不同的consumer同時處理partition中的資料

Kafka中consumer與partition為 1:n的關係,即1個分割槽僅由1個消費者消費;1個消費者可以同時消費多個不同分割槽。分割槽細化訊息粒度,消費者同時處理多個分割槽的越多,達到高效的訊息併發處理。