kafka介紹
在一上篇文章介紹了訊息佇列的使用場景,現在介紹下kafka
Kafka主要特點:
- 同時為釋出和訂閱提供高吞吐量。據瞭解,Kafka每秒可以生產約25萬訊息(50 MB),每秒處理55萬訊息(110 MB)。
- 可進行持久化操作。將訊息持久化到磁碟,因此可用於批量消費,例如ETL,以及實時應用程式。通過將資料持久化到硬碟以及replication防止資料丟失。
- 分散式系統,易於向外擴充套件。所有的producer、broker和consumer都會有多個,均為分散式的。無需停機即可擴充套件機器。
- 訊息被處理的狀態是在consumer端維護,而不是由server端維護。當失敗時能自動平衡。
- 支援online和offline的場景。
kafka 架構
Kafka的整體架構非常簡單,是顯式分散式架構,producer、broker(kafka)和consumer都可以有多個。Producer,consumer實現Kafka註冊的介面,資料從producer傳送到broker,broker承擔一箇中間快取和分發的作用。broker分發註冊到系統中的consumer。broker的作用類似於快取,即活躍的資料和離線處理系統之間的快取。客戶端和伺服器端的通訊,是基於簡單,高效能,且與程式語言無關的TCP協議。
幾個基本概念:
- Topic:特指Kafka處理的訊息源(feeds of messages)的不同分類。
- Partition:Topic物理上的分組,一個topic可以分為多個partition,每個partition是一個有序的佇列。partition中的每條訊息都會被分配一個有序的id(offset)。
- Message:訊息,是通訊的基本單位,每個producer可以向一個topic(主題)釋出一些訊息。
- Producers:訊息和資料生產者,向Kafka的一個topic釋出訊息的過程叫做producers。
- Consumers:訊息和資料消費者,訂閱topics並處理其釋出的訊息的過程叫做consumers。
- Broker:快取代理,Kafka叢集中的一臺或多臺伺服器統稱為broker。
訊息傳送流程
1.Producer根據指定的partition方法(round-robin、hash等),將訊息釋出到指定topic的partition裡面
2.kafka叢集接收到Producer發過來的訊息後,將其持久化到硬碟,並保留訊息指定時長(可配置),而不關注訊息是否被消費。
3.Consumer從kafka叢集pull資料,並控制獲取訊息的offset
訊息儲存策略
談到kafka的儲存,就不得不提到分割槽,即partitions,建立一個topic時,同時可以指定分割槽數目,分割槽數越多,其吞吐量也越大,但是需要的資源也越多,同時也會導致更高的不可用性,kafka在接收到生產者傳送的訊息之後,會根據均衡策略將訊息儲存到不同的分割槽中。
在每個分割槽中,訊息以順序儲存,最晚接收的的訊息會最後被消費。
與生產者的互動
- 生產者在向kafka叢集傳送訊息的時候,可以通過指定分割槽來發送到指定的分割槽中
- 也可以通過指定均衡策略來將訊息傳送到不同的分割槽中
- 如果不指定,就會採用預設的隨機均衡策略,將訊息隨機的儲存到不同的分割槽中
與消費者的互動
- 在消費者消費訊息時,kafka使用offset來記錄當前消費的位置
- 在kafka的設計中,可以有多個不同的group來同時消費同一個topic下的訊息,如圖,我們有兩個不同的group同時消費,他們的的消費的記錄位置offset不互相干擾。
- 對於一個group而言,消費者的數量不應該多餘分割槽的數量,因為在一個group中,每個分割槽至多隻能繫結到一個消費者上,即一個消費者可以消費多個分割槽,一個分割槽只能給一個消費者消費
- 若一個group中的消費者數量大於分割槽數量的話,多餘的消費者將不會收到任何訊息。