訊息佇列的延時以及過期失效問題

2021-10-21 10:24:53 字數 841 閱讀 3362

面試題:

情況:可能消費端出了問題,不消費了,或者消費地極其緩慢。可能你的訊息佇列集群的磁碟都快寫滿了,都沒人消費,這個時候怎麼辦?積壓的時間太長了,導致 rabbitmq 設定了訊息過期時間後訊息就沒了怎麼辦?

臨時緊急擴容:具體操作步驟和思路如下:

先修復 consumer 的問題,確保其恢復消費速度,然後將現有 consumer 都停掉

新建乙個 topic ,partition 是原來的 10 倍,臨時建立好原先10倍或者20倍的 queue 數量

然後寫乙個臨時的分發資料的 consumer 程式,這個程式部署上去消費積壓的資料,消費之後不做耗時的處理,直接均勻輪詢寫入臨時建立好的10被數量的 queue

接著臨時徵用10倍的機器來部署 consumer,每一批 consumer 消費乙個臨時 queue 的資料

這種做法相當於是臨時將queue資源和 consumer 資源擴大10倍,以正常的10倍速度來消費資料

等快速消費完積壓資料後,需要恢復原先部署架構,重新用原來的 consumer 機器來消費訊息

假設使用的是 rabbitmq,rabbitmq是可以設定過期時間的(ttl),如果訊息在 queue 中積壓超過一定的時間就會被 rabbitmq 清理掉,資料就丟失了。

解決:手動寫程式,將丟失的那批資料,一點點地查出來,然後重新插入到 mq 裡面去。

訊息積壓在 mq 裡,如果很長時間都沒處理掉,導致 mq 都快寫滿了。

解決:臨時寫程式,接入資料來消費,消費乙個丟棄乙個,快速消費掉所有的訊息,接著走補資料的方案。

如何解決訊息佇列的延時以及過期失效問題?

如果你積壓了幾百萬到上千萬的資料,即使消費者恢復了,也需要大概1小時的時間才能恢復過來 一般這個時候,只能操作臨時緊急擴容了,具體操作步驟和思路如下 1 先修復consumer的問題,確保其恢復消費速度,然後將現有cnosumer都停掉 2 新建乙個topic,partition是原來的10倍,臨時...

訊息佇列筆記二 訊息積壓,過期失效,設計MQ

水平擴容增加 consumer 的例項數量 先修復 consumer 的問題,確保其恢復消費速度,然後將現有 consumer 都停掉 新建乙個 topic,partition 是原來的 10 倍,臨時建立好原先 10 倍的 queue 數量 然後寫乙個臨時分發資料的 consumer 程式,這個程...

為什麼要使用訊息佇列以及訊息佇列的優缺點

1 為什麼要使用訊息佇列?1 解耦 傳統模式的缺點 系統間耦合性太強,如上圖所示,系統a在 中直接呼叫系統b和系統c的 如果將來d系統接入,系統a還需要修改 過於麻煩!中介軟體模式 將訊息寫入訊息佇列,需要訊息的系統自己從訊息佇列中訂閱,從而系統a不需要做任何修改。2 非同步 傳統模式缺點 一些非必...