現象:php
kafka寫入和消費一切正常狀況,經過一段時間的運行,偶爾發現取不到數據;最後查看kafka消費狀況,發現有阻塞。html
解決:java
一、確認kafka運行狀況,是否有堵塞負載均衡
/kafka/bin/目錄下執行ui
./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper=localhost2181 --group=0url
被網上一些代碼片斷坑騙 ~~~~(>_<)~~~~ 設計
二、檢查代碼server
我出現的問題,通過確認後發現,全部topic 的group.id都是同樣的名稱htm
三、 不一樣的topic 設置不一樣的group.idget
Consumers
本質上kafka只支持Topic.每一個consumer屬於一個consumer group;反過來講,每一個group中能夠有多個consumer.發送到Topic的消息,只會被訂閱此Topic的每一個group中的一個consumer消費.
若是全部的consumer都具備相同的group,這種狀況和queue模式很像;消息將會在consumers之間負載均衡.
若是全部的consumer都具備不一樣的group,那這就是"發佈-訂閱";消息將會廣播給全部的消費者.
在kafka中,一個partition中的消息只會被group中的一個consumer消費;每一個group中consumer消息消費互相獨立;咱們能夠認爲一個group是一個"訂閱"者,一個Topic中的每一個partions,只會被一個"訂閱者"中的一個consumer消費,不過一個consumer能夠消費多個partitions中的消息.kafka只能保證一個partition中的消息被某個consumer消費時,消息是順序的.事實上,從Topic角度來講,消息仍不是有序的.
kafka的設計原理決定,對於一個topic,同一個group中不能有多於partitions個數的consumer同時消費,不然將意味着某些consumer將沒法獲得消息.
因此不用在意consumer的多少,要保證consumer的消費來至同一個訂閱者,也就是一個consumer對應一個group;若是多個consumer來同時設置同一個group,是取不到數據的;
group.id 是自定義的。