消息隊列(4):Kafka

介紹

kafka是一個支持分佈式的消息系統,基於發佈/訂閱模式。
kafka由LinkedIn公司開發,2010年成爲Apache頂級項目。
源碼是由java寫的。

基本概念

1、Broker

kafka集羣中的每臺機器,都叫一個broker.

2、Topic(主題)

一個topic代表着一類消息,不同類型的消息,就用不同的topic區分。

3、Partition(分區)

一個Partition就是一個隊列。一個topic可以由多個Partition組成。
一個topic的多個partition可能會放在多個Broker上。

4、Producer(生產者)

向kafka發消息的客戶端

5、Consumer(消費者)

從kafka拉消息的客戶端

6、Consumer Group(消費者組)

這個相當於給消費者分了個組,在註冊消費者的時候,要先指定是哪個消費者組。
這個概念,主要是爲了kafka實現廣播和單播的區分。
每多一個消費者組,topic的消息就會多複製一份給這個消費者組。
消費者組只會把消息發給本組的一個消費者。
這樣的話,如果實現單播,那就一個消費者一個消費者組;如果要廣播,那就多個消費者用一個消費者組。

7、Zookeeper

zk主要就是集羣管理,包括Broker和Consumer。

圖解

發現有網友畫的一張很好的圖,把kafka的數據流畫的很清晰。
在這裏插入圖片描述
如上圖,簡單解釋下:
有兩個producer,producer0發topic0的消息,producer1發topic0和topic1的消息。
有3個broker作爲一個集羣,由zk管理,上圖沒畫zk,自行腦補。
我們看到數據存儲的最小單位是topic的某個partition。
這個圖,爲每個Partition做了兩個副本,我們稱爲一主兩從。
主用紅色標識,從用黑色標識。
producer發消息都是發到主上,然後由主複製消息到從上。
消費者拉消息,也是從主上拉。
主從關係由zk來管理,基本上就是zk選舉那一套。
consumer group0有一個消費者consumer0。
consumer0消費topic0的消息,所以我們看到consumer0從topic0的兩個partition上同時拉消息。
consumer group1有三個consumer,012。
這裏先指出一個上圖的問題,一般一個consumer group是隻消費一個topic的,我理解的是作者爲了畫出消費者數量與partition數據的關係,才這麼畫的,我們一個一個講。

首先看consumer group1消費topic0的情況,topic0有兩個partition,但consumer group1有三個consumer,所以consumer0負責拉topic0partiton0隊列的消息,consumer1負責拉topic0partition1隊列的消息。

再看consumer group1消費topic1的情況。由於topic1只有一個partition0,所以consumer group1也就只派出consumer0來拉這個topic1partition0的消息。

如果你認認真真把上面的看完,那麼你應該能理解,所謂的一個topic多少個partition對於多少個consumer了吧。還是以3個爲例,理想狀況下,就是3個broker,對於一個tipic的3個partition的主分別部署在不同的broker上,主對於的兩個從分別不在其他兩個broker上。同時consumer group對應有3個consumer,分別從3個partition主上拉消息。