一、前言
首先,rabbitMQ並沒有為消息的重復消費而設計一種解決方法,這個解決方法需要我們來根據業務自己實現,我整理了幾種常見的解決方法。
二、消息重復發送導致消息被重復消費的場景
第一個場景,在生產者發送消息給rabbitMQ服務器的時候,有可能因為網絡波動等情況,導致生產者收不到rabbitMQ服務器的應答,導致生產者再發送一條消息。
第二個場景,也是因為網絡波動等問題,導致rabbitMQ服務器在向消費者發送消息的時候,沒有收到消費者的應答,重復向消費者發生消息。
這兩個場景,其實最終都是導致消費者重復消費多次消息,所以在一般的場景下,我們只需要在消費者那里做消息重復消費的保障即可。
三、解決方法
使用數據庫一個表來記錄消息的狀態(或者用redis來記錄也可以)。每次消費之前,都查詢判斷消息的狀態,是否已經被消費了。這個狀態可以是id。例如,如果消息是訂單,而且id是全局唯一的,那么只需要拿這個訂單id來做判斷即可。
四、總結
總的來說,就是要保證消費者的冪等性。
冪等性,指的是多次調用接口,結果是一致的。例如,訂單接口,不能因為用戶多次點擊提交訂單而創建多張訂單,支付接口,同一張訂單不能多次支付等等。
如何保證冪等性?
① 使用代碼的邏輯判斷,就像上述的解決方法一樣,判斷消息狀態是否已經被消費過了
② 使用token,要申請,一次有效性。
例如,在創建訂單的場景下。首先,先生成一個token,返回給客戶端存起來,同時也在后端存起來(redis)。當他創建訂單的時候,帶着這個token來請求后端,后端判斷redis里是否存在,如果存在,則操作成功,同時刪除token(刪除了之后,就算他重復多次調用,前邊的判斷不成立,這樣子就不能多次操作了)。
參考鏈接:
https://blog.csdn.net/A_droid/article/details/109569433