訊息堆積
解決方案:
- 增加消費者或後臺相關元件的吞吐能力
- 增加消費的多執行緒處理
- 根據不同的業務實現不同的丟棄任務,選擇不同的策略淘汰任務
- 預設情況下,RabbitMQ消費者為單執行緒序列消費,設定並行消費兩個關鍵屬性,他們設定的是對每個消費者在初始化的時候設定的併發消費者個數,prefetchCount 是每次一次性從broker中獲取的待消費的訊息個數。
- concurrentConsumer
- prefetchConcurrentConsumer
訊息丟失
解決方案:
- 持久化
- 訊息確認機制
訊息在生產者,訊息佇列,消費者中都有可能丟失。
1. 在生產者中丟失
原因:生產者傳送訊息成功後,訊息佇列沒有收到訊息,訊息在從生產者傳輸到佇列的過程中丟失,一般可能是網路不穩定。
解決方案: 傳送方採用訊息確認機制,當訊息成功被MQ接收到後, 會給生產者發一個確認訊息,表示成功接收。
2. 在訊息佇列中丟失
原因:訊息到MQ後, 還沒有被消費就被MQ給丟失了。比如MQ伺服器當機或者未進行持久化重啟。
解決方案:持久化交換機,佇列和訊息。確保MQ伺服器重啟時仍然能從磁碟恢復對應的佇列,交換機和訊息,然後我們把MQ 做多臺分散式叢集,防止出現所有的MQ伺服器掛掉。
注意: 交換機,佇列和訊息都要持久化。
3. 在消費者中丟失
原因:預設消費者消費的時,設定的是自動回覆MQ, 收到了訊息,MQ會立刻刪除自身儲存的這條訊息,如果訊息已經在MQ中被刪除,但消費者的業務處理出現異常或者當機,那麼就導致改訊息沒有被成功處理從而導致訊息丟失。
解決方案: 設定手動ACK。