1. 程式人生 > >Kafka系列4-基本概念及消費者組(Consumer Group)的理解

Kafka系列4-基本概念及消費者組(Consumer Group)的理解

幾個基本概念:

    Kafka是一個分散式流資料系統,使用Zookeeper進行叢集的管理。與其他訊息系統類似,整個系統由生產者、Broker Server和消費者三部分組成,生產者和消費者由開發人員編寫,通過API連線到Broker Server進行資料操作。我們重點關注三個概念:

    Topic,是Kafka下訊息的類別,類似於RabbitMQ中的Exchange的概念。這是邏輯上的概念,用來區分、隔離不同的訊息資料,遮蔽了底層複雜的儲存方式。對於大多數人來說,在開發的時候只需要關注資料寫入到了哪個topic、從哪個topic取出資料。 

    Partition,是Kafka下資料儲存的基本單元,這個是物理上的概念。同一個topic的資料,會被分散的儲存到多個partition中,這些partition可以在同一臺機器上,也可以是在多臺機器上,比如下圖所示的topic就有4個partition,分散在兩臺機器上。這種方式在大多數分散式儲存中都可以見到,比如MongoDB、Elasticsearch的分片技術,其優勢在於:有利於水平擴充套件,避免單臺機器在磁碟空間和效能上的限制,同時可以通過複製來增加資料冗餘性,提高容災能力。為了做到均勻分佈,通常partition的數量通常是Broker Server數量的整數倍。

    Consumer Group

,同樣是邏輯上的概念,是Kafka實現單播和廣播兩種訊息模型的手段。同一個topic的資料,會廣播給不同的group;同一個group中的worker,只有一個worker能拿到這個資料。換句話說,對於同一個topic,每個group都可以拿到同樣的所有資料,但是資料進入group後只能被其中的一個worker消費。group內的worker可以使用多執行緒或多程序來實現,也可以將程序分散在多臺機器上,worker的數量通常不超過partition的數量,且二者最好保持整數倍關係,因為Kafka在設計時假定了一個partition只能被一個worker消費(同一group內)。

Broker

物理概念,指服務於Kafka的一個node。

topic

是一個邏輯概念。

MQ中的抽象概念,是一個消費標示。用於保證Producer以及Consumer能夠通過該標示進行對接。可以理解為一種Naming方式。

partition

是一個物理概念。partition會實際儲存在系統的摸個目錄。

Topic的一個子概念,一個topic可具有多個partition,但Partition一定屬於一個topic。

值得注意的是:

  • 在實現上都是以每個Partition為基本實現單元的。
  • 消費時,每個消費執行緒最多隻能使用一個partition。
  • 一個topic中partition的數量,就是每個user group中消費該topic的最大並行度數量。

User group

為了便於實現MQ中的多播,重複消費等引入的概念。如果ConsumerA以及ConsumerB同在一個UserGroup,那麼ConsumerA消費的資料ConsumerB就無法消費了。

即:所有usergroup中的consumer使用一套offset。

Offset

Offset專指Partition以及User Group而言,記錄某個user group在某個partiton中當前已經消費到達的位置。


什麼是消費者組(Consumer Group)


consumer group是kafka提供的可擴充套件且具有容錯性的消費者機制。既然是一個組,那麼組內必然可以有多個消費者或消費者例項(consumer instance),它們共享一個公共的ID,即group ID。組內的所有消費者協調在一起來消費訂閱主題(subscribed topics)的所有分割槽(partition)。當然,每個分割槽只能由同一個消費組內的一個consumer來消費。理解consumer group記住下面這三個特性就好了:

1)consumer group下可以有一個或多個consumer instance,consumer instance可以是一個程序,也可以是一個執行緒
2)group.id是一個字串,唯一標識一個consumer group
3)consumer group下訂閱的topic下的每個分割槽只能分配給某個group下的一個consumer(當然該分割槽還可以被分配給其他group)