為什麼會出現訊息重複?訊息重複的原因有兩個:1.生產時訊息重複,2.消費時訊息重複。
由於生產者傳送訊息給mq,在mq確認的時候出現了網路波動,生產者沒有收到確認,實際上mq已經接收到了訊息。這時候生產者就會重新傳送一遍這條訊息。
生產者中如果訊息未被確認,或確認失敗,我們可以使用定時任務+(redis/db)來進行訊息重試。
消費者消費成功後,再給mq確認的時候出現了網路波動,mq沒有接收到確認,為了保證訊息被消費,mq就會繼續給消費者投遞之前的訊息。這時候消費者就接收到了兩條一樣的訊息。
如何保證mq的消費是冪等性的,需要結合具體的業務來看 :
比如你拿個資料要寫庫,你先根據主鍵查一下,如果這資料都有了(最好帶有時間戳字段,每次更新都以時間戳為條件),你就別插入了,update一下好吧
比如你是寫redis,那沒問題了,反正每次都是set,天然冪等性
比如你不是上面兩個場景,那做的稍微複雜一點,你需要讓生產者傳送每條資料的時候,裡面加乙個全域性唯一的id,類似訂單id之類的東西,然後你這裡消費到了之後,先根據這個id去比如redis里查一下,之前消費過嗎?如果沒有消費過,你就處理,然後這個id寫redis。如果消費過了,那你就別處理了,保證別重複處理相同的訊息即可。
RabbitMQ 如何保證訊息不丟失?
rabbitmq 如何保證訊息不丟失?rabbitmq一般情況很少丟失,但是不能排除意外,為了保證我們自己系統高可用,我們必須作出更好完善措施,保證系統的穩定性。下面來介紹下,如何保證訊息的絕對不丟失的問題,下面分享的絕對乾貨,都是在知名網際網路產品的產線中使用。1.訊息持久化 2.ack確認機制 ...
RabbitMQ如何保證訊息不丟失
rabbitmq 大致有三種場景會發生訊息丟失 1 consumer沒有接收到訊息,消費之前 2 consumer接收到訊息,訊息暫存記憶體,還未消費 3 consumer消費時 第一種丟失場景就像我剛剛到達便利店,還沒選好買什麼商品,這個時候便利店突然斷電,無法消費 這種場景下使用message ...
RabbitMQ 如何保證訊息不丟失?
1.發訊息的時候確定訊息發出去了 訊息確認 2.rabbitmq伺服器也不會丟訊息 儲存到硬碟中 3.收訊息的時候,確保業務完成 手動應答 下面來介紹下,如何保證訊息的絕對不丟失的問題,下面分享的絕對乾貨,都是在知名網際網路產品的產線中使用。1.訊息持久化 2.ack確認機制 3.設定集群映象模式 ...