Kafka Consumer 執行 poll 操作時獲取空數據的原因分析

1. 場景:

當用戶需要獲取數據時,後端從指定 topic 下消費1條數據;每次操作的間隔爲 0~∞

2. 現象:

每隔一段時間,在kafka消費數據時,會出現獲取數據爲空的情況

3. 問題排除路徑:

  1. 由於 Topic 中的數據很多,不可能出現數據被取光的情況,首先懷疑是網絡問題;在協調運維幫忙檢查後發現,kafka運行正常,沒有發現異常;
  2. 假設網絡擁堵,導致 poll() 超時,那麼就增大該操作的等待時間,將 consumer.poll.timeout.ms 從“100”設置爲“500”,但問題仍未解決;
  3. 觀察日誌,發現當發生“Reblance”時,手動提交消費偏移量, 此時偏移值遠遠超過實際消費的數據量,當只消費了幾十條數據時,此時的偏移量 offset 的值爲幾十萬,說明中間的這些數據已經被消費過了;
  4. 是不是代碼中有個線程沒有關閉一直在消費數據?在檢查了一遍代碼後,沒有發現這個異常線程;
  5. 最後,定位到問題,topic數據默認保存時間爲 7 天。

4. 總結經驗

  1. kafka只是一個消息隊列,應該能夠判斷出公司的kafka對於數據不會進行持久化存儲;
  2. 當得到運維給出的無異常回復後,應能夠判斷出不是“玄學”的網絡問題,特別是在仔細檢查完代碼後;
  3. 對 kafka 掌握不夠全面,不瞭解其清理過期數據的機制,導致在看到offset的“異常值”後,沒有迅速判斷出是過期策略的問題。

5. 遺留問題

多個topic同時消費數據,經常出現“獲取數據失敗”的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章