MQ怎么解決消息堆積的問題
-
網上普通回答
- 修復consumer的問題,確保其恢復消費速度,然后將現有consumer都停止
- 臨時建立好原先10倍或者20倍的queue數量
- 然后寫一個臨時的分發數據的consumer程序,這個程序部署上去消費積壓的數據,消費之后不做耗時的處理,直接均勻輪詢寫入臨時建立好的10倍數量的queue
- 接着臨時征用10倍機器來部署consumer,每一批consumer消費一個臨時queue的數據
- 這種做法相當於臨時將queue資源和consumer資源擴大了10倍,以正常的10倍速度
但是這種方法遠水解決不了進渴
-
用Shovel
- 概念:當某個隊列的消費堆積嚴重時,比如超過某個設定的閥值,就可以通過Shovel將隊列消息移交到別的一個集群。
- 當檢測到一個隊列出現嚴重的消息堆積的時候,比如可以通過/api/queue/vhost/name接口獲取到隊列的消息個數超過2000w或者消息的占用大小超過10g的時候,就啟用shovel1將隊列queue中的消息轉發到備份集群的隊列queue2。
- 當檢測到隊列queue的消息個數低於100w的時候或者大小小於1GB就停止shovel1,然后等queue慢慢處理剩余的堆積。
- 當queue的消息個數低於10W或者大小小於100MB時,就開啟shovel2將隊列queue2中暫存的消息返還給對queue。
- 當檢測到隊列queue消息個數大於100W或者大小高於1GB就將shovel2停掉。