1. 程式人生 > >什麼是Kafka——分散式訊息系統

什麼是Kafka——分散式訊息系統

What’s is Kafka:

Apache Kafka是分散式釋出-訂閱訊息系統。他最初由Linkedln公司開發,之後成為Apache專案的一部分。Kafka是一種快速,可拓展的,設計內在就是分散式的,分割槽的和可複製的提交日誌服務

  • Apache Kafka與傳統訊息系統相比,有以下不同:
    • 它被設計為一個分散式系統,易於向外拓展;
    • 它同時為釋出和訂閱提供吞吐量;
    • 它支援多訂閱者,當失敗時能自動平衡消費者;
    • 它將訊息持久化到磁碟,因此可用於批量消費,例如ETL以及實時應用程式。

Apache Kafka Architecture(架構):

這裡寫圖片描述
kafka分散式訊息系統,提供了生產者,緩衝區,消費者的模型
- producer:生產者,產生資料的地方(nginx)。往broker中的某個話題裡面生產資料–>生產者向kafka傳送資料流的時候需要執行話題
- consumer:消費者,可以訂閱多個話題,使用消費資料的地方(flume)
- broker:訊息中介軟體處理結點,中間的kafka叢集,儲存訊息,由多個server組成。
- topic(話題):是特定型別的訊息流。訊息是位元組的有效負載(Payload),話題是訊息的分類名或種子(Feed)名。例如page view日誌、click日誌等都可以以topic的形式存在,Kafka叢集能夠同時負責多個topic的分發。
這裡寫圖片描述


Kafka設計思想:

kafka將所有訊息組成多個topic的形式進行儲存,每一個topic可以被分成多個partition,每一個partition由多個訊息組成,每一個訊息都被標識了一個offset,每個訊息是按順序儲存在partition中(每條訊息記錄都包含一個鍵,一個值和一個時間戳)訊息以一個個id的方式組合起來。consumer會選擇一個topic,通過id指定從哪個位置開始消費訊息(使用資料)消費完成之後會保留id(offset)下次可以直接從這個id繼續進行消費,也可以從任意位置進行消費。消費者可以根據需求,指定offset進行消費
重要名詞解釋

  • Partition:
    topic物理上的分組,一個topic可以分為多個partition,每個partition是一個有序的佇列。
  • offset:(偏移量)每個partition都由一系列有序的、不可變的訊息組成,這些訊息被連續的追加到partition中。partition中的每個訊息都有一個連續的序列號叫做offset,用於partition唯一標識一條訊息.

Kafka為什麼那麼快:

  • 生產者(寫入資料):生產者(producer)是負責向Kafka(broker)提交資料的,Kafka會把收到的訊息都寫入到硬碟中(broker),它絕對不會丟失資料。為了優化寫入速度Kafka採用了兩個技術,順序寫入和MMFile。
    • 順序寫入:因為硬碟是機械結構,每次讀寫都會定址(offset)->寫入,其中定址是一個“機械動作”,它是最耗時的。所以硬碟最“討厭”隨機I/O,最喜歡順序I/O。為了提高讀寫硬碟的速度,Kafka就是使用順序I/O。每一個Partition其實都是一個檔案,收到訊息後Kafka會把資料插入到檔案末尾(訊息儲存在partition是順序儲存(offset))這種方法有一個缺陷——沒有辦法刪除資料,所以Kafka是不會刪除資料的(話題保留策略),它會把所有的資料都保留下來,每個消費者(Consumer)對每個Topic都有一個offset用來表示讀取到了第幾條資料。
    • Memory Mapped Files(mmf):即便是順序寫入硬碟,硬碟的訪問速度還是不可能追上記憶體。所以Kafka的資料並不是實時的寫入硬碟,它充分利用了現代作業系統分頁儲存來利用記憶體提高I/O效率。mmf也被翻譯成記憶體對映檔案,在64位作業系統中一般可以表示20G的資料檔案,它的工作原理是直接利用作業系統的Page來實現檔案到實體記憶體的直接對映。完成對映之後你對實體記憶體的操作會被同步到硬碟上(作業系統在適當的時候)。

Kafka特點:

  • 支援高Throughput(高吞吐量)的應用,源自多分割槽
  • 無需停機即可擴充套件機器。每一個topic中保留的訊息非常龐大,通過partition將訊息切分成多個子訊息,並通過負載均衡策略將partition分配到不同的server中,這樣當機器負載重的時候通過擴容叢集將訊息從新分配。
  • 持久化:通過將資料持久化到硬碟以及replication防止資料丟失
  • 支援online(實時消費)和offline(離線消費,比如按天消費)的場景
  • 依賴Zookeeer叢集,狀態資訊都寫在Zookeeer叢集裡