1. 程式人生 > >記用 SpringBoot 消費 Kafka 過程中的一次問題排查

記用 SpringBoot 消費 Kafka 過程中的一次問題排查

1、現象

最近在接受公司Kafka的叢集,之前公司重啟一臺伺服器的時候出現重複消費的情況,所以就跟消費端的服務一起聯調查冊。消費端目前有兩個服務,但是在測試的過程中發現其中一個服務可以接受到資料,但是另一個服務端卻接受不到資料。於是查看了一下它的日誌,關鍵日誌如下:

[INFO] org.apache.kafka.clients.consumer.internals.AbstractCoordinator - Successfully joined group group-id-test with generation 81
[INFO] org.apache.kafka.clients
.consumer.internals.ConsumerCoordinator - Setting newly assigned partitions [] for group group-id-test

根據日誌發現,完全沒有 partition 分配給我們去消費。。。
而且每次啟動的情況不一樣,有事有分配到,有時沒有分配到。。


2、分析

因為 topic 的 partition對於consumer的分配會隨著 partition數量的變化 和 相同 groupId 的 consumer 的變化而 動態分配,所以我猜測在另一臺機器上已經有一個相同 groupId 的程式在消費著同一個 topic。
注:我這裡比較特殊,這個 topic 的 partition 為 1,Kafka 的版本為 0.10.2.0。


3、探索

可以通過 Kafka 提供的工具來檢視該 groupId 對應的消費情況,具體命令如下:

##純手打。。
bin/kafka-consumer-groups.sh --bootstrap-server XXX:9092 --group your-group-id --describe

就可以看到該 group-id 對應的消費的情況
我發現 我消費的 topic 這一行中的 hostId 有值,且不是本地的IP!
(由於是在內網,所以就沒有截圖了)

所以我的分析是對的


你也可以通過程式碼測試一下,啟動兩個程式用相同的groupID去消費同一個topic,你會發現每次 consumer 端啟動或者停止的時候,partition 都會 重新分配給 consumer。。