1. 程式人生 > >效能優化之MQ問題分析及解決方案

效能優化之MQ問題分析及解決方案

問題現象描述

  1. 傳送訊息或者接收訊息不能正常進行,訪問ActiveMQ掛起,互動無響應。
  2. ActiveMQ報記憶體溢位。
  3. 重啟ActiveMQ後控制恢復正常。

分析過程

1) ActiveMQ訊息傳送有兩種方式:同步和非同步。一般為提高訊息處理能力,通過非同步方式解耦實現邏輯同業務分離,提高訊息處理效率。
2) 傳送訊息一般有持久化訊息和非持久化訊息兩類。持久化訊息在一些事務較為嚴格的應用場景下為確保一致性以及可靠性選用,相反非持久化不要求可靠性非常高,但吞吐率等效能相對較高,通常訊息傳送預設型別為持久化訊息。
3) 視覺化訊息處理機制採用的是預設的非同步+持久化訊息。
4) 訊息傳送與接收由代理,生產和消費三個主體構成。生產出來的訊息無論是持久化還是非持久化訊息均通過代理將訊息存至訊息儲存器,如果消費者處理速度與生產者生產速度相當,那麼訊息儲存器將保持相對平衡穩定狀態,如果訊息者速度低於生產者速度,那麼訊息儲存器訊息將會存滿。這就好比長江中的水,平時供需平衡,而到了夏季可能會澇,冬季可能會旱,平衡被打破。同理,視覺化訊息處理需要防止爆的可能性,一旦爆,就會導致上述現象產生。
5) 通過模擬生產環境,持續傳送訊息,訊息總量控制在幾十萬到幾百萬之間。用一個消費者模擬消費異常堵塞狀況,實驗環節對訊息解碼後的邏輯處理部分改成休眠方式。

6) 測試過程:

 生產端
        每次傳送12800位元組,訊息一直不停生產。
 消費端:
        接收到訊息後,並不立即處理訊息,而是將訊息處理的邏輯休眠,使訊息一直處理不能被消費的情形.

 結論:上述環境就緒後,在傳送8萬多條資訊時,ACTIVEMQ就會報記憶體溢位。

 圖1:ACTIVEMQ控制檯截圖

圖2:WEB監控截圖

圖3:測試程式異常

解決方案

1) 修改ActiveMQ相關配置項(找到ACTIVEMQ安裝目錄下,進入conf目錄,開啟activemq.xml檔案),有如下兩種修改方案:

A.通過修改訊息遊標實現。目前預設的訊息超容後放到記憶體,而一旦記憶體壓力大的話,MQ就可能會爆,因此將超過容量後的訊息轉移至檔案系統不失為一個解決方案。

B.放大訊息儲存器使用記憶體(首先看該部分是否有被註釋,如有先取消註釋部分)

2)程式優化建議
A.防止接收訊息處理主執行緒過長,可以將接收訊息與處理訊息業務邏輯分離,通過非同步實現
B.由於對訊息可靠性要求不是特別高,可以採用非持久化方式
C.訊息最好設定生命週期,例如控制在10S之內,可有效降低訊息處理中轉速度
D.訊息處理程式部分最好是可配置的,不要在程式當中出現硬編碼。