1. 程式人生 > 其它 >淺談 RabbitMQ(二)解決訊息丟失

淺談 RabbitMQ(二)解決訊息丟失

淺談 RabbitMQ(一)工作模型與 Exchange 型別

目錄

一、訊息傳遞分析

RabbitMQ的具體結構圖參考筆者上一篇文章,下面畫個訊息傳遞的簡圖

從上圖可知,要確保一個訊息正確的傳遞,需要在四個傳遞階段都能正確傳遞:

  1. 確保訊息成功由生產者傳送到RabbitMQ伺服器
  2. 確保訊息被交換機路由到正確的佇列
  3. 確保訊息在佇列中不丟失
  4. 確保訊息成功被消費者消費

二、訊息丟失的幾種情況

知道了訊息如何傳遞,自然也就知道了訊息丟失的情況了:

  1. 在生產者傳送到RabbitMQ伺服器時丟失
  2. 在交換機路由到佇列時丟失
  3. 在佇列中丟失
  4. 在消費時丟失

三、訊息丟失解決方案

那麼解決訊息丟失自然也是根據這幾種情況來分析了:

(1)解決生產者傳送訊息到MQ的丟失

1. 服務端確認-事務模式

生產者每傳送一次訊息,MQ就響應一次。這種模式效率低,不推薦

2. 服務端確認-確認模式

生產者傳送訊息後,伺服器傳送確認ACK給生產者,根據確認的方式又分為三種:

  1. 單條確認:生產者每傳送一次訊息,伺服器傳送確認一次,類似於事務模式,效率低
  2. 批量確認:設定傳送訊息次數後,伺服器傳送確認
  3. 非同步確認:生產者監聽伺服器傳送的確認事件,由伺服器決定何時確認

(2)解決在交換機路由時的訊息丟失

  1. 在無法路由到佇列時將訊息回發給生產者

  2. 建立交換機時指定一個備份交換機,路由失敗時將訊息傳送到備份交換機

(3)解決在佇列時的訊息丟失

  1. 建立佇列時設定佇列持久化
  2. 訊息持久化

(4)解決在消費時的訊息丟失

消費者消費訊息時預設為自動確認,即消費者剛收到訊息時就給MQ傳送ACK確認,此時MQ會將訊息出隊;如果想要在消費的邏輯處理完成後再確認訊息,就需要消費者設定手動確認ACK,假如在消費過程中發生異常,無法傳送確認給MQ伺服器,訊息將無法出隊,導致堆積,所以需要在finally塊中設定unAck或者將訊息回發給MQ伺服器

(5)其它保證訊息正確消費的情況

  1. 補償機制

比如生產者在傳送訊息到MQ時,始終收不到確認,那麼就需要重發訊息,但是重發也不能一直髮送,會導致重複訊息堆積。所以有兩種解決方案:① 設定等待確認超時,超時後再重發訊息;② 重發時控制次數

  1. 訊息冪等

假如在消費過程中同一訊息被消費多次,在特定場景中將產生重大影響,比如轉賬等,所以需要保證同一條訊息在消費多次後保證操作一致(類似於介面冪等性:重複呼叫時保證資料一致)


END


作者:金木研King
轉載請註明原文連結:https://www.cnblogs.com/jinzlblog/p/15147420.html