kafka 簡介

weixin_34185560發表於2018-05-21

什麼是Kafka?

KafKa是一款由 Apache 軟體基金會開源,使用 Scala 編寫的一個 高吞吐 分散式
釋出 - 訂閱 訊息系統 和一個強大的佇列,可以處理大量的資料,並使您能夠將訊息從一個端點傳遞到另一個端點。

Kafka適合 離線 和 線上 訊息消費。 Kafka訊息保留在磁碟上,並在群集內複製以防止資料丟失Kafka構建在ZooKeeper同步服務之上。 它與Apache Spark Streaming 非常好地整合,用於實時流式資料分析。

概念介紹

  • Broker
    Kafka叢集包含一個或多個伺服器,這種伺服器被稱為 broker

  • Producer
    負責釋出訊息到 Kafka broker,在傳送訊息之前,會對訊息進行分類,即Topic。

  • Topic
    每條釋出到 Kafka 叢集的訊息都有一個主題,這個主題被稱為Topic。通過對訊息指定主題可以將訊息分類(物理上不同 Topic 的訊息分開儲存,邏輯上一個 Topic 的訊息雖然儲存於一個或多個broker 上 但使用者只需指定訊息的 Topic 即可生產或消費資料而不必關心資料存於何處)

  • Partition
    Partition是物理上的概念,每個Topic包含一個或多個Partition

  • Consumer
    訊息消費者,向Kafka broker讀取訊息的客戶端。通過對訊息指定主題可以將訊息分類,消費者可以只關注自己需要的Topic中的訊息

  • Consumer Group
    每個Consumer屬於一個特定的Consumer Group(可為每個Consumer指定group name,若不指定group name則屬於預設的group)

訊息傳輸流程

3149801-79b86dbe6fad6459.png

上圖展示了兩個 producer 傳送了分類為 topic1 的訊息,另外一個 producer 傳送了 topic2 的訊息。
從上圖中就可以看出同一個 Topic 下的消費者和生產者的數量並不是對應的。

kafka 伺服器訊息儲存策略

3149801-a4b681e35862cefd.png

談到kafka的儲存,就不得不提到分割槽,即partitions,建立一個topic時,同時可以指定分割槽數目,分割槽數越多,其吞吐量也越大,但是需要的資源也越多,同時也會導致更高的不可用性,kafka在接收到生產者傳送的訊息之後,會根據均衡策略將訊息儲存到不同的分割槽中。

3149801-364026dc4164adc4.png

在每個分割槽中,訊息以順序儲存,最晚接收的的訊息會最後被消費。

3149801-b98804478c4a6377.png

生產者在向kafka叢集傳送訊息的時候,可以通過指定分割槽來傳送到指定的分割槽中。
也可以通過指定均衡策略來將訊息傳送到不同的分割槽中。
如果不指定,就會採用預設的隨機均衡策略,將訊息隨機的儲存到不同的分割槽中。

與 consumer 的互動

3149801-9b70b3be00857ff7.png

在消費者消費訊息時,kafka使用 offset 來記錄當前消費的位置。

在kafka的設計中,可以有多個不同的group來同時消費同一個topic下的訊息,如圖,我們有兩個不同的group同時消費,他們的的消費的記錄位置offset各不專案,不互相干擾。

對於一個group而言,消費者的數量不應該多餘分割槽的數量,因為在一個group中,每個分割槽至多隻能繫結到一個消費者上,即一個消費者可以消費多個分割槽,一個分割槽只能給一個消費者消費

因此,若一個group中的消費者數量大於分割槽數量的話,多餘的消費者將不會收到任何訊息。

相關文章