kafka系列-入門篇之消費組
前言
消費組是kafka一個非常有意思的設計。在高併發方面,可以使用多個臺伺服器放在同一個消費組中,就可以保證所有的消費者拉取的消費不會重複並且完整,這樣就可以提高消費者的執行效率。
前期準備
建立topic
kafka-topics.sh --zookeeper localhost:2181 --create --topic topic_demo --partitions 3 --replication-factor
請注意這裡的partition數量為3,在後面的實驗會產生影響
啟動生產者和消費者
kafka-console-producer.sh --broker-list localhost:9092 --topic topic_demo
kafka-console-consumer.sh --zookeeper localhost:2181 --topic topic_demo --consumer-property group.id=group1
通過新增–consumer-property group.id=group1指定消費組為group1
1個生產者和3個消費者
三個消費者非常理想地將6條訊息平均消費,每個消費者兩條訊息,組合起來就是所有的訊息,保證了資料的完整性。
1個生產者和4個消費者
很出出乎意料的是,當分割槽數量是3,而消費者數量是4的時候,會有一個消費者拉取不到任何訊息
來看看消費組的消費者情況,可以看到下圖,有一個消費者是沒有對應的partition的,所以它就拉取不到訊息。因此,我們在建立topic的時候,可以多建一些分割槽,保證多個消費者都能對應到分割槽,避免有消費者被浪費。當然,在建立完topic後,利用命令kafka-reassign-partitions.sh是可以進行增加分割槽的。
1個生產者和2個消費者
當使用2個消費者的時候,同樣出現了我們沒有預料到的現象,那就是消費資料的沒有被平均分配,而是一個是4條,一個是2條。原因就是一個消費者對應2個分割槽,另一個消費者對應一個分割槽,而訊息的消費是根據分割槽進行平均消費的。
看一看此時的消費分組就更清楚了,下圖中,partition0和partition1對應的consumer_id都是group1_Jeffrey.local-1538062744435-29ee459d。
在有些情況下,還會出現資料順序不對,請看下圖,有一個消費者拉取的訊息是3265。
kafka的訊息是按分割槽來儲存的,只能保證分割槽上訊息是按照順序拉取(關於kafka儲存可以參考我的
下圖顯示的是訊息存放的位置,producer將123456推送給broker,broker在訊息分別存放在3個partition裡面。partition0有訊息3和6,partition1有訊息2和5,partition2有訊息1和4。consumer0消費了partition0和partition1中的訊息,並且先消費的是partition0,就出現拉取的訊息是3265了。
下圖是kafka日誌中訊息的存放情況。
總結
同一個消費組的多個消費者相當於一個消費者去消費資料,提高了消費的效率。topic的分割槽,給消費順序帶來了一些麻煩,通過了解到kafka的底層原理後,在遇到問題時,就可能解釋並解決。