如何處理RabbitMQ 訊息堆積和訊息丟失問題

威少發表於2021-07-17

訊息堆積

 解決方案:

  • 增加消費者或後臺相關元件的吞吐能力
  • 增加消費的多執行緒處理
  • 根據不同的業務實現不同的丟棄任務,選擇不同的策略淘汰任務
  • 預設情況下,RabbitMQ消費者為單執行緒序列消費設定並行消費兩個關鍵屬性,他們設定的是對每個消費者在初始化的時候設定的併發消費者個數,prefetchCount 是每次一次性從broker中獲取的待消費的訊息個數。
    • concurrentConsumer
    • prefetchConcurrentConsumer 

訊息丟失

  解決方案:

  • 持久化
  • 訊息確認機制

        訊息在生產者,訊息佇列,消費者中都有可能丟失。

1. 在生產者中丟失

    原因:生產者傳送訊息成功後,訊息佇列沒有收到訊息,訊息在從生產者傳輸到佇列的過程中丟失,一般可能是網路不穩定。

 

         解決方案: 傳送方採用訊息確認機制,當訊息成功被MQ接收到後, 會給生產者發一個確認訊息,表示成功接收。

2. 在訊息佇列中丟失

      原因:訊息到MQ後, 還沒有被消費就被MQ給丟失了。比如MQ伺服器當機或者未進行持久化重啟。

 

         解決方案:持久化交換機,佇列和訊息。確保MQ伺服器重啟時仍然能從磁碟恢復對應的佇列,交換機和訊息,然後我們把MQ 做多臺分散式叢集,防止出現所有的MQ伺服器掛掉。

         注意: 交換機,佇列和訊息都要持久化

3. 在消費者中丟失

    原因:預設消費者消費的時,設定的是自動回覆MQ, 收到了訊息,MQ會立刻刪除自身儲存的這條訊息,如果訊息已經在MQ中被刪除,但消費者的業務處理出現異常或者當機,那麼就導致改訊息沒有被成功處理從而導致訊息丟失。

 

             解決方案: 設定手動ACK。

  

 

相關文章