1. 程式人生 > >Kafka 基礎概述

Kafka 基礎概述

1.什麼是kafka?

    在流式計算中,Kafka一般用來快取資料,Storm通過消費Kafka的資料進行計算。

    1)Apache Kafka是一個開源訊息系統,由Scala寫成。是由Apache軟體基金會開發的一個開源訊息系統專案。

     2)Kafka最初是由LinkedIn公司開發,並於  2011年初開源。2012年10月從Apache Incubator畢業。該專案的目標是為處理實時資料提供一個統一、高通量、低等待的平臺。

    3)Kafka是一個分散式訊息佇列。Kafka對訊息儲存時根據Topic進行歸類,傳送訊息者稱為Producer,訊息接受者稱為Consumer,此外kafka叢集有多個kafka例項組成,每個例項(server)成為broker。

    4)無論是kafka叢集,還是producer和consumer都依賴於zookeeper叢集儲存一些meta資訊,來保證系統可用性。

2.訊息佇列內部實現原理(Kafka 只是訊息佇列中的一種)

    (1) 點對點模式(一對一,消費者主動拉取資料,訊息收到後訊息清除。即:pull模式)

    點對點模型通常是一個基於拉取或者輪詢的訊息傳送模型,這種模型從佇列中請求資訊,而不是將訊息推送到客戶端。這個模型的特點是傳送到佇列的訊息被一個且只有一個接收者接收處理,即使有多個訊息監聽者也是如此。

    (2) 釋出/訂閱模式(一對多,資料生產後,推送給所有訂閱者。即:push模式)

    釋出訂閱模型則是一個基於推送的訊息傳送模型。釋出訂閱模型可以有多種不同的訂閱者,臨時訂閱者只在主動監聽主題時才接收訊息,而持久訂閱者則監聽主題的所有訊息,即使當前訂閱者不可用,處於離線狀態。

3.為什麼需要訊息佇列

(1) 解耦

    允許你獨立的擴充套件或修改兩邊的處理過程,只要確保它們遵守同樣的介面約束。

(2) 冗餘

    訊息佇列把資料進行持久化直到它們已經被完全處理,通過這一方式規避了資料丟失風險。許多訊息佇列所採用的"插入-獲取-刪除"正規化中,在把一個訊息從佇列中刪除之前,需要你的處理系統明確的指出該訊息已經被處理完畢,從而確保你的資料被安全的儲存直到你使用完畢。

(3) 擴充套件性

    因為訊息佇列解耦了你的處理過程,所以增大訊息入隊和處理的頻率是很容易的,只要另外增加處理過程即可。

(4) 靈活性 & 峰值處理能力

    在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見。如果為以能處理這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費。使用訊息佇列能夠使關鍵元件頂住突發的訪問壓力,而不會因為突發的超負荷的請求而完全崩潰。

(5) 可恢復性

    系統的一部分元件失效時,不會影響到整個系統。訊息佇列降低了程序間的耦合度,所以即使一個處理訊息的程序掛掉,加入佇列中的訊息仍然可以在系統恢復後被處理。

(6) 順序保證

    在大多使用場景下,資料處理的順序都很重要。大部分訊息佇列本來就是排序的,並且能保證資料會按照特定的順序來處理。(Kafka保證一個Partition內的訊息的有序性)

(7) 緩衝

    有助於控制和優化資料流經過系統的速度,解決生產訊息和消費訊息的處理速度不一致的情況。

(8) 非同步通訊

    很多時候,使用者不想也不需要立即處理訊息。訊息佇列提供了非同步處理機制,允許使用者把一個訊息放入佇列,但並不立即處理它。想向佇列中放入多少訊息就放多少,然後在需要的時候再去處理它們。

4.Kafka架構

    (1) Producer :訊息生產者,就是向kafka broker發訊息的客戶端;

    (2) Consumer :訊息消費者,向kafka broker取訊息的客戶端;

    (3) Topic(主題) :可以理解為一個佇列。屬於特定類別的訊息流稱為主題,資料儲存在主題中,主題被拆分成分割槽,每個這樣的分割槽包含不可變有序序列的訊息。分割槽被實現為具有相等大小的一組分段檔案。

    (4) Broker :一臺kafka伺服器就是一個broker。一個叢集由多個broker組成。一個broker可以容納多個topic;

    (5) Partition:為了實現擴充套件性,一個非常大的topic可以分佈到多個broker(即伺服器)上,一個topic可以分為多個partition,每個partition是一個有序的佇列。partition中的每條訊息都    會被分配一個有序的id(offset)。kafka只保證按一個partition中的順序將訊息發給consumer,不保證一個topic的整體(多個partition間)的順序;

    (6) Partition offset(分割槽偏移):kafka的儲存檔案都是按照offset.kafka來命名,用offset做名字的好處是方便查詢。例如你想找位於2049的位置,只要找到2048.kafka的檔案即可。當然the first offset就是00000000000.kafka。

    (7) Replicas of partition(分割槽備份)

副本只是一個分割槽的備份。 副本從不讀取或寫入資料。 它們用於防止資料丟失。

    (8)  Consumer Group (CG):這是kafka用來實現一個topic訊息的廣播(發給所有的consumer)和單播(發給任意一個consumer)的手段。一個topic可以有多個CG。topic的訊息會複製(不是真的複製,是概念上的)到所有的CG,但每個partion只會把訊息發給該CG中的一個consumer。如果需要實現廣播,只要每個consumer有一個獨立的CG就可以了。要實現單播只要所有的consumer在同一個CG。用CG還可以將consumer進行自由的分組而不需要多次傳送訊息到不同的topic;