RabbitMQ常見疑難問題

一.消息隊列消息堆積如何處理?redis

當消息產生的速度長時間遠遠大於消費的速度的時候,就會產生消息的堆積。緩存

消息堆積的影響:
  • 1.新消息可能沒法進入MQ。
  • 2.舊消息沒法丟失。
  • 3.等待消費的時間過長,超出業務的容忍範圍。
產生堆積可能的因素:
  • 1.生產者大量發佈消息
  • 2.消費者消費失敗,沒有ack自動應答。
  • 3.消費者可能出現性能瓶頸。
  • 4.消費服務掛掉。
解決思路:
  • 1.排查消費者運行效率、性能問題。
  • 2.消費者多線程處理。
  • 3.增長更多的消費者。
處理過程:

新生產的消息轉移到新的隊列,增長新的服務器部署新的消費者來消費。
原來的消息隊列的消息能夠繼續慢慢消費。服務器

2、消息丟失怎麼辦?網絡

消息流通過程 —>生產者—>隊列—>消費者多線程

1.生產者環節丟失消息

場景:生產者在投遞消息過程當中,突遇斷網可能丟失消息。ide

解決方案:生產者在消息投遞環節開啓消息確認機制(事物或者comfirm),發送失敗時候重試。性能

2.隊列中丟失消息

場景:隊列服務宕機、重啓,消息丟失。線程

解決方案:投遞消息的時候,交換機、隊列、消息都設置爲持久化durable=true隊列

3.消費者中丟失消息

場景:消費者啓用了自動應答,消費者服務掛掉。內存

解決方案:通道設置每次只處理一條消息,關閉消費者自動應答,消費完成手動應答。

3、有序消費

情形1:多條不冪等消息如消息一、消息二、消息3,採用worker模式投遞,因爲worker模式的消費者是競爭者關係,拿到的消息順序是有問題的。

解決方案:將消息一、消息二、消息3分別投遞進不一樣隊列,每一個隊列對應一個消費者

情形2:消費者開啓了多線程

解決方案:消息隊列分配消息後,建立多個內存隊列,每一個線程消費者去消費內存隊列裏面的消息

4、消息重複消費

出現緣由:消費者消息消息的時候,MQ沒有收到消息的ack應答。

場景:
  • 1.消費者消費消息後沒有ack。
  • 2.消費者在消費消息後,ack時網絡異常。
解決步驟:
  1. 消費者消費後,記錄經過緩存記錄消息的消費標識,消息id如redis的setnx
  2. 若是消費成功且ack成功,則刪除記錄的消息標記。
  3. 若是ack失敗,消息下次被消費消息時候,先去查詢消息的消費標識,已經消費則直接ack,未消費則繼續消費。
概念:

消息冪等性:消息不管怎麼執行都是一樣結果。非冪等性案例:扣款、扣庫存、添加數據。

相關文章
相關標籤/搜索