1. 場景:
當用戶需要獲取數據時,後端從指定 topic 下消費1條數據;每次操作的間隔爲 0~∞
2. 現象:
每隔一段時間,在kafka消費數據時,會出現獲取數據爲空的情況
3. 問題排除路徑:
- 由於 Topic 中的數據很多,不可能出現數據被取光的情況,首先懷疑是網絡問題;在協調運維幫忙檢查後發現,kafka運行正常,沒有發現異常;
- 假設網絡擁堵,導致 poll() 超時,那麼就增大該操作的等待時間,將 consumer.poll.timeout.ms 從“100”設置爲“500”,但問題仍未解決;
- 觀察日誌,發現當發生“Reblance”時,手動提交消費偏移量, 此時偏移值遠遠超過實際消費的數據量,當只消費了幾十條數據時,此時的偏移量 offset 的值爲幾十萬,說明中間的這些數據已經被消費過了;
- 是不是代碼中有個線程沒有關閉一直在消費數據?在檢查了一遍代碼後,沒有發現這個異常線程;
- 最後,定位到問題,topic數據默認保存時間爲 7 天。
4. 總結經驗
- kafka只是一個消息隊列,應該能夠判斷出公司的kafka對於數據不會進行持久化存儲;
- 當得到運維給出的無異常回復後,應能夠判斷出不是“玄學”的網絡問題,特別是在仔細檢查完代碼後;
- 對 kafka 掌握不夠全面,不瞭解其清理過期數據的機制,導致在看到offset的“異常值”後,沒有迅速判斷出是過期策略的問題。
5. 遺留問題
多個topic同時消費數據,經常出現“獲取數據失敗”的問題。