在企業項目中,利用RocketMQ接收數據,存庫。
由於是第一次在項目中具體的使用RocketMQ,一直采坑。
1、發現問題:在最終的聯調過程中,並發壓測,訂單數據丟失,同一時刻,oms推送900+的數據,結果消費者只獲取並入庫了20幾條,絕大部分消息丟失。
自己手寫了一個生產者測試類,用最原始的循環的方式快速存入多條數據(此處為了測試方便,並不是重復消費問題,實際項目中消費端要加冪等去重)。一次就存5條但是每次都丟兩條,好像最后兩條數據永遠消費不到的樣子。

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

到這里,該問題還是沒有解決。
(2)懷疑是由於消費者ConsumeFromWhere配置的問題,我剛開始配置的是CONSUME_FROM_FIRST_OFFSET:第一次啟動從隊列初始位置消費,后續再啟動接着上次消費的進度開始消費。然后我重新啟動消費者,竟然神奇的好使了。
問題似乎從這里解決了
(3) 第二天,問題又出現了,說明之前的改了半天還是沒找到問題的源頭,之前我一直用wifi連接,結果我進了消費者組里面 看了,發現了消費者組內有其他的消費者占中了我一個隊列,問題就是出現在這里。
如圖,當我的本地沒有啟動消費者時,這個客戶端會占用所有的隊列。當我起來的時候,我就占用了前兩個隊列,而該客戶端還會占用一個隊列。這就是問題所在了,我們在同一個消費者組下,它占用了一個隊列,勢必會消費掉那個隊列的數據,導致我消費的只是部分數據。


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