訊息積壓 一般處理方法

2022-06-22 15:15:09 字數 1338 閱讀 8954

如何解決訊息佇列的延時以及過期失效問題?訊息佇列滿了以後該怎麼處理?

思考是什麼導致了訊息積壓?是consumer程式bug?是consumer消費的速度落後於訊息生產的速度?

積壓了多長時間,積壓了多少量?

對業務的影響?

解決思路

1. 如果僅僅是consumer消費的速度落後於訊息生產的速度的話,可以考慮採用擴容消費者群組的方式。

2. 如果積壓比較嚴重,積壓了上百萬、上千萬的訊息。

修復現有consumer的問題,並將其停掉。

重新建立乙個容量更大的topic,比如patition是原來的10倍。

編寫乙個臨時consumer程式,消費原來積壓的佇列。該consumer不做任何耗時的操作,將訊息均勻寫入新建立的佇列裡。

將修復好的consumer部署到原來10倍的機器上消費新佇列。

訊息積壓解決後,恢復原有架構。

3. 如果訊息已經丟失

由於有的訊息佇列有過期失效的機制,造成了大量的訊息丟失。

這種情況只能將丟失的那批資料,寫個臨時程式,一點一點的查出來,然後重新灌入mq裡面去。 

大量訊息在mq裡積壓了幾個小時了還沒解決

幾千萬條資料在mq裡積壓了七八個小時,最簡單的方法可以讓他恢復消費速度,然後等待幾個小時消費完畢。 

乙個消費者一秒是1000條,一秒3個消費者是3000條,一分鐘是18萬條,1000多萬條 ,所以如果你積壓了幾百萬到上千萬的資料,即使消費者恢復了,也需要大概1小時的時間才能恢復過來  

一般這個時候,只能操作臨時緊急擴容了,具體操作步驟和思路如下:  

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

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

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

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

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

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

topic ---- kafka

資料庫 ---- es

參考:

訊息積壓完整面試問題:

快速處理積壓訊息

場景二場景三 1 大量訊息在mq裡積壓了七八個小時還沒解決 一般的解決方案是修復消費者,讓消費者恢復消費速度。但是資料量大的情況下需要耗時很久。一般這個時候,只能操作緊急擴容了,1 先修復consumer的問題,確保其恢復消費的速度 2 新建乙個topic,partition是原來的10倍,臨時建立...

處理訊息佇列積壓

當消費者出現異常,很容易引起佇列積壓,如果一秒鐘1000個訊息,那麼乙個小時就是幾千萬的訊息積壓,是非常可怕的事情,但是生產線上又有可能會出現 當訊息積壓來不及處理,rabbitmq如果設定了訊息過期時間,那麼就有可能由於積壓無法及時處理而過期,這訊息就被丟失了 解決方法 不建議在生產環境使用資料過...

訊息積壓的處理

一 訊息積壓的原因 訊息積壓的直接原因,一定是系統中某個部分出現了效能問題,來不及處理上游傳送的訊息,才會導致訊息積壓。二 優化效能來避免訊息積壓 在使用訊息佇列的系統中,對於效能的優化,主要體現在生產者和消費者兩部分的業務邏輯中。對於訊息佇列本身的效能,作為使用者不需要太關注。主要原因是對於絕大多...