一 重復消息
為什么會出現消息重復?消息重復的原因有兩個:1.生產時消息重復,2.消費時消息重復。
1.1 生產時消息重復
由於生產者發送消息給MQ,在MQ確認的時候出現了網絡波動,生產者沒有收到確認,實際上MQ已經接收到了消息。這時候生產者就會重新發送一遍這條消息。
生產者中如果消息未被確認,或確認失敗,我們可以使用定時任務+(redis/db)來進行消息重試。
1.2消費時消息重復
消費者消費成功后,再給MQ確認的時候出現了網絡波動,MQ沒有接收到確認,為了保證消息被消費,MQ就會繼續給消費者投遞之前的消息。這時候消費者就接收到了兩條一樣的消息。
如何保證MQ的消費是冪等性的,需要結合具體的業務來看 :
比如你拿個數據要寫庫,你先根據主鍵查一下,如果這數據都有了(最好帶有時間戳字段,每次更新都以時間戳為條件),你就別插入了,update一下好吧
比如你是寫redis,那沒問題了,反正每次都是set,天然冪等性
比如你不是上面兩個場景,那做的稍微復雜一點,你需要讓生產者發送每條數據的時候,里面加一個全局唯一的id,類似訂單id之類的東西,然后你這里消費到了之后,先根據這個id去比如redis里查一下,之前消費過嗎?如果沒有消費過,你就處理,然后這個id寫redis。如果消費過了,那你就別處理了,保證別重復處理相同的消息即可。