RocketMQ訊息堆積問題
RocketMQ訊息堆積問題
RocketMQ訊息堆積主要分為三個層次的問題:
其一是Producer生產速率過快,什麼場景呢,比如Producer故障,比如DOS攻擊,比如業務高峰(超過企業預估的,例如12306訂票,雙十一下單,這些一開始的時候都有超過預期的情況)。
其二是Broker訊息堆積,比如Broker的效能瓶頸,Broker同步策略導致訊息堆積等
其三是Consumer本身已經拉取訊息的堆積。consumer訊息拉取超過一定量之後會暫停訊息拉取,一方面是消費者本身消費能力的現在,另一方面是由於消費端過多的訊息容易造成GC頻繁。
一般情況下我們都可以通過限流和擴容來達到快速處理堆積的訊息的目標。
訊息堆積的處理策略整體上說就是生產者producer限流,RocketMQ擴容,消費者consumer擴容,具體要根據監控指標來判斷。
熟悉了訊息堆積場景,我們還需要明確訊息堆積的診斷,常用的工具包括producer傳送速率監控,producer伺服器效能監控(網路、CPU、記憶體等),broker效能監控(網路、CPU、記憶體,磁碟使用率,GC等),消費端消費速率,消費端consumer伺服器效能監控(網路、CPU、記憶體、資料庫、GC等)
MQ訊息積壓
這種時候只能操作臨時擴容,以更快的速度去消費資料了。具體操作步驟和思路如下:
①先修復consumer的問題,確保其恢復消費速度,然後將現有consumer都停掉。
②臨時建立好原先10倍或者20倍的queue數量(新建一個topic,partition是原來的10倍)。
③然後寫一個臨時分發訊息的consumer程式,這個程式部署上去消費積壓的訊息,消費之後不做耗時處理,直接均勻輪詢寫入臨時建好分10數量的queue裡面。
④緊接著徵用10倍的機器來部署consumer,每一批consumer消費一個臨時queue的訊息。
⑤這種做法相當於臨時將queue資源和consumer資源擴大10倍,以正常速度的10倍來消費訊息。
⑥等快速消費完了之後,恢復原來的部署架構,重新用原來的consumer機器來消費訊息。