最近工作中用到了RocketMQ,現記錄下,如何正確實現消費~
- 消費者需要注意的問題
- 防止重復消費
- 如何快速消費
- 消費失敗如何處理
- Consumer具體實現
- 防止重復消費
重復消費會造成數據不一致等問題。所以,消費者要做到消費冪等。
1)每次消費,記錄messageId;如果再次消費該message,查詢messageId是否已存在,已存在,就跳過消費;
2)使用具體業務狀態來防止重復消費,例如如果狀態已經被變更,說明已有消息被消費;
- 如何快速消費
消費過程緩慢,勢必會造成消息積壓,如何提高消費速度勢必比較重要:
每次接收到消息后,不做處理(具體不一定,最好是簡單),直接將消息保存到本地數據庫,然后后台異步處理消息,這么做的好處:
1) 快速消費,如果消費過程比較耗時(大量更新,RPC調用等),可以將消息插入本地,然后后台異步消費,消費完成,更新本地消息狀態。
2)失敗可控,如果某條消息消費失敗,不依賴於mq的重試機制,可以定時重跑消費失敗的消息,或者人工觸發重試消費。
- 消費失敗如何處理
消費過程不能保證不出異常,雖然mq消費失敗有重試機制,但我們並沒有這么做,而是:
跟上面提到的一樣,由於已經把消息存到了本地,消費失敗,也不用擔心,后台重跑即可~~~~
如果大家覺得上面說的哪方面有問題,或者有更好的實踐,歡迎留言~~~~