由於生產者傳送訊息給mq,在mq確認的時候出現了網路波動,生產者沒有收到確認,實際上mq已經接收到了訊息。這時候生產者就會重新傳送一遍這條訊息。
生產者中如果訊息未被確認,或確認失敗,我們可以使用定時任務+(redis/db)來進行訊息重試
消費者消費成功後,再給mq確認的時候出現了網路波動,mq沒有接收到確認,為了保證訊息被消費,mq就會繼續給消費者投遞之前的訊息。這時候消費者就接收到了兩條一樣的訊息。
由於重複訊息是由於網路原因造成的,因此不可避免重複訊息。但是我們需要保證訊息的冪等性。
讓每個訊息攜帶乙個全域性的唯一id,即可保證訊息的冪等性,具體消費過程為:
消費者獲取到訊息後先根據id去查詢redis/db是否存在該訊息
如果不存在,則正常消費,消費完畢後寫入redis/db
如果存在,則證明訊息被消費過,直接丟棄
RabbitMQ如何防止訊息丟失及重複消費
一 rabbitmq出現訊息丟失的情況及其解決辦法 如圖所示,rabbitmq丟失訊息的情況可以傳送在任何乙個節點。a 丟失的原因 因為網路傳輸的不穩定性,當生產者在向mq傳送訊息的過程中,mq沒有成功接收到訊息,但是生產者卻以為mq成功接收到了訊息,不會再次重 送該訊息,從而導致訊息的丟失。b 解...
記一次線上環境rabbitmq訊息重複消費的始與末
與這個bug糾結了幾天,從懷疑消費者消費失敗訊息重發到生產者訊息傳送多次,均無果,問題只發生在雲上,測試環境無法重現,陷入了打log到否定問題點的死迴圈,好在重複消費不會影響正常的業務邏輯,不過再次收到重複的消費處理失敗會傳送郵件,郵箱被轟炸了幾天。請教眾方大神無果,把懷疑點瞄準雲服務 這裡就不說是...
標頭檔案如何避免重複宣告
向c語言專案graph1中新增graph2.h這樣乙個標頭檔案。在 clion 中我們會發現,在標頭檔案graph2.h中,會自動生成以下三行 ifndef graph1 graph2 h define graph1 graph2 h part1 endif part2這三行 主要作用是 防止該標頭...