RocketMQ部分消息消費不到的問題


在企業項目中,利用RocketMQ接收數據,存庫。

由於是第一次在項目中具體的使用RocketMQ,一直采坑。

1、發現問題:在最終的聯調過程中,並發壓測,訂單數據丟失,同一時刻,oms推送900+的數據,結果消費者只獲取並入庫了20幾條,絕大部分消息丟失。

                        自己手寫了一個生產者測試類,用最原始的循環的方式快速存入多條數據(此處為了測試方便,並不是重復消費問題,實際項目中消費端要加冪等去重)。一次就存5條但是每次都丟兩條,好像最后兩條數據永遠消費不到的樣子。

 

                             但在,RocketMQ在控制台上明顯可以看到這五條數據都已經發送到topic下

2、原因排查及解決:
        (1)我在程序中原本就有在關鍵地方打印日志,通過閱讀日志信息,我發現,在MessageListenerConcurrently()這個類中的consumeMessage方法中,前后兩條消息幾乎同時打印接收日志。為防止發生線程安全問題,及日志的可讀性(其實只解決了日志可讀性),及接收到一條消息的日志一連串的打印出來,中間不要穿插別的消息的日志,對整個方法加上鎖sychronized。

           到這里,該問題還是沒有解決。

       (2)懷疑是由於消費者ConsumeFromWhere配置的問題,我剛開始配置的是CONSUME_FROM_FIRST_OFFSET:第一次啟動從隊列初始位置消費,后續再啟動接着上次消費的進度開始消費。然后我重新啟動消費者,竟然神奇的好使了。
          問題似乎從這里解決了
  (3) 第二天,問題又出現了,說明之前的改了半天還是沒找到問題的源頭,之前我一直用wifi連接,結果我進了消費者組里面 看了,發現了消費者組內有其他的消費者占中了我一個隊列,問題就是出現在這里。

          如圖,當我的本地沒有啟動消費者時,這個客戶端會占用所有的隊列。當我起來的時候,我就占用了前兩個隊列,而該客戶端還會占用一個隊列。這就是問題所在了,我們在同一個消費者組下,它占用了一個隊列,勢必會消費掉那個隊列的數據,導致我消費的只是部分數據。

 2、總結:

  同一個消費者組的消費者,會分別占用不同的隊列,均衡瓜分消費該topic下的消息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM