如何解決訊息佇列的延時以及過期失效問題?訊息佇列滿了以後該怎麼處理?
思考是什麼導致了訊息積壓?是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如果設定了訊息過期時間,那麼就有可能由於積壓無法及時處理而過期,這訊息就被丟失了 解決方法 不建議在生產環境使用資料過...
訊息積壓的處理
一 訊息積壓的原因 訊息積壓的直接原因,一定是系統中某個部分出現了效能問題,來不及處理上游傳送的訊息,才會導致訊息積壓。二 優化效能來避免訊息積壓 在使用訊息佇列的系統中,對於效能的優化,主要體現在生產者和消費者兩部分的業務邏輯中。對於訊息佇列本身的效能,作為使用者不需要太關注。主要原因是對於絕大多...