RabbitMQ:消息重復消費


一、前言

首先,rabbitMQ並沒有為消息的重復消費而設計一種解決方法,這個解決方法需要我們來根據業務自己實現,我整理了幾種常見的解決方法。

 

二、消息重復發送導致消息被重復消費的場景

第一個場景,在生產者發送消息給rabbitMQ服務器的時候,有可能因為網絡波動等情況,導致生產者收不到rabbitMQ服務器的應答,導致生產者再發送一條消息。

第二個場景,也是因為網絡波動等問題,導致rabbitMQ服務器在向消費者發送消息的時候,沒有收到消費者的應答,重復向消費者發生消息。

這兩個場景,其實最終都是導致消費者重復消費多次消息,所以在一般的場景下,我們只需要在消費者那里做消息重復消費的保障即可。

 

三、解決方法

使用數據庫一個表來記錄消息的狀態(或者用redis來記錄也可以)。每次消費之前,都查詢判斷消息的狀態,是否已經被消費了。這個狀態可以是id。例如,如果消息是訂單,而且id是全局唯一的,那么只需要拿這個訂單id來做判斷即可。

 

四、總結

總的來說,就是要保證消費者的冪等性。

冪等性,指的是多次調用接口,結果是一致的。例如,訂單接口,不能因為用戶多次點擊提交訂單而創建多張訂單,支付接口,同一張訂單不能多次支付等等。

如何保證冪等性?

① 使用代碼的邏輯判斷,就像上述的解決方法一樣,判斷消息狀態是否已經被消費過了

② 使用token,要申請,一次有效性。

 

例如,在創建訂單的場景下。首先,先生成一個token,返回給客戶端存起來,同時也在后端存起來(redis)。當他創建訂單的時候,帶着這個token來請求后端,后端判斷redis里是否存在,如果存在,則操作成功,同時刪除token(刪除了之后,就算他重復多次調用,前邊的判斷不成立,這樣子就不能多次操作了)。

參考鏈接:

https://blog.csdn.net/A_droid/article/details/109569433

 


免責聲明!

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



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