1. 問題描述
某個服務連線kafka總是報如下錯誤:
:06:04.880 [kafka-producer-network-thread | producer-1] ERROR o.s.k.s.LoggingProducerListener - [error,261] - Exception thrown when sending a message with key='null' and payload='{"msg":"success","code":"200","data":[{"ropewayId":"2","ssId":"1","latitude":"301189677","longitude"...' to topic pos_msg: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for pos_msg-0:120000 ms has passed since batch creation
翻譯翻譯大概的意思是傳送訊息到kafka的時候超時了,訊息傳送不過去。
2. 問題排查
2.1 檢查kafka是否執行正常
這裏我用的kafka-ui這個ui工具,非常方便檢視kafka的一些情況如下(下圖為博主自己的圖,):
可以看到,kafka服務是線上無疑的,那麼肯定是kafka客戶端的問題。
2.1.1 手動連線kafka看看能否成功
(1) 首先放開埠
懷疑是9092埠未放開導致的,放開9092埠之後也無效!
(2) docker容器當中手動向kafka推送訊息
由於採用docker部署的kafka,這裏現在容器中看看能否向kafka成功推送訊息:
docker exec -it kafka /bin/bash #進入容器 kafka-console-producer.sh --broker-list localhost:9092 --topic test # 向kafka寫入訊息
出現如下返回表示寫入訊息成功,說明至少kafka在docker容器內部是可以成功寫入訊息的:
(3) docker容器外部向kafka推送訊息
爲了方便測試,我又新建了一個kafka的docker映象kafka-test,在這個映象中我們來測試是否能夠成功傳送訊息:
docker exec -it kafka-test /bin/bash #進入容器 kafka-console-producer.sh --broker-list xxx.xxx.xxx.xxx:9193 --topic test # 向kafka寫入訊息
如下圖我們發現,kafka即使是透過公網ip也能夠正常的將訊息推送過去,那麼問題可能出在Spring Boot的配置上
(4)向出問題的topic推送訊息
雖然上面向着測試topic推送訊息無論是容器內部還是容器外部都沒有出問題,但是當我直接向出問題的topic推送訊息的時候確出現了同樣的報錯:
2.2 檢查Spring Boot專案本身
如果透過以上針對於kafka的測試,發現kafka服務本身是正常的,並且也能夠正常的接受到訊息,那麼出現上面報錯的原因只可能是——Spring Boot專案本身有問題!
但是博主這裏無需排查這部分問題,後面遇到了再來填坑
3. 修復問題
3.1 修改爲新的topic
這裏不太明白為什麼老的topic沒辦法正常推送資料,於是新建立了一個topic發現可以正常傳送資料了。
3.2 kafka消費者測試
但是問題依舊沒有被解決!!! 雖然修改爲新的topic之後,kafka的訊息能夠被正常的傳送過去了,但是消費者這邊卻不消費,真的很煩,這裏繼續查消費者的問題:
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
發現根本沒反應終端直接卡住,這說明消費沒有成功:
最後參考這篇文章:blog.csdn.net/hxc2101/art… 將zookeeper中的/brokers/topics/__consumer_offsets主題刪除之後,訊息消費回復了正常
THE END
搞了一早上才弄好原因可能是kafka重灌之後zookeeper中的消費offset不正確所導致的bug,哎真難受。