ActiveMQ - message cursor

五柳-先生發表於2015-09-23

因群裡的“追風”問message cursor到底是有什麼用,以及怎麼用,我答應他出篇原始碼分析文件,現在有點時間,就把message cursor分析一下。

在分析的過程種發現,如果不從原始碼分析,只是從已有的使用者使用文件中,確實沒法用好message cursor。

activeMQ的message cursor分為3種

l         Store-based

l         VM

l         File-based

下面我具體分析每種message cursor的實現:

Store-based:

 

 

                           圖一:Store-based實現原理圖

     訊息接收後,首先完成訊息儲存的工作,如(1)所示,然後會判斷是否有空閒的記憶體可用,如果有的話,就走路徑1,直接把訊息存放在記憶體中的LinkedHashMap,如果沒有可用記憶體,則走路徑2,當需要訊息的時候,直接從訊息儲存的介質裡每次讀取一批訊息,然後存入LinkedHashMap。

File:



 

 

                            圖二:file實現原理圖

     訊息接收後,首先完成訊息儲存的工作,如(1)所示,然後會判斷是否有空閒的記憶體可用,如果有的話,就走路徑1,直接把訊息存放在記憶體中的LinkedList,如果沒有可用記憶體,則走路徑2,把訊息寫入臨時檔案中,當需要訊息的時候,直接從臨時檔案中讀寫一批,然後送入LinkedList。

VM:



 

 

                            圖三:VM實現原理圖

     訊息接收後,首先完成訊息儲存的工作,如(1)所示,然後直接把訊息存放在記憶體中的LinkedList。

 

 

3種訊息cursor的比較

訊息cursor型別

效能

穩定性

最佳使用場景

Store-based

當記憶體不夠時,需要進行1次訊息儲存操作,效能在3種方式中居中

最好

activeMQ預設使用該cursor,因為它能滿足大部分場景需要

File

當記憶體不夠時,需要進行2次訊息儲存操作,並且在刪除訊息的時候也就相應的要刪除2次,效能在3種方式中最差

居中

主要用在當訊息儲存慢(如訊息是放在資料庫裡),並且消費者相對快的情況下

VM

在記憶體夠的情況下,3種message cursor效能一樣

最容易出現記憶體溢位的問題

很快,但不能處理慢訊息消費者

 

 

下面是“追風”提供的message cursor的測試記錄,特此感謝參與。

基於儲存的訊息指標_測試結果

測試方法

結果說明

是否通過

備註

開500個queue 持久化訊息/非持久化訊息 的傳送客戶端,一直髮送,不接收,因為是預設的,所以不用在伺服器端配置。

1.對於非持久化訊息,一定數量之後,也會產生臨時檔案。

2.對於持久化的訊息,則適用該方式的訊息指標,直到達到磁碟空間的設定上限。

 

 

 

 

 

 

VM訊息指標_測試結果

測試方法

結果說明

是否通過

備註

開500個queue 持久化訊息/非持久化訊息 的傳送客戶端,一直髮送,在Activemq.xml配置檔案中配置:

<pendingQueuePolicy>

<vmQueueCursor />

</pendingQueuePolicy>

佇列中儲存到一定量訊息的時候,broker不再接收生產者傳送過來的訊息,56W左右,broker也不報錯,客戶端也不報錯。

若設定producerflowControl=false,則訊息數量持續增長,直到broker報錯:

WARN AMQMessageStore                - Message could not be added to long term store: Java heap space

java.lang.OutOfMemoryError: Java heap space

 

 

 

 

 

基於檔案的訊息指標_測試結果

測試方法

結果說明

是否通過

備註

開500個queue 持久化訊息/非持久化訊息 的傳送客戶端,一直髮送,在Activemq.xml配置檔案中配置:

<pendingQueuePolicy>

<fileQueueCursor />

</pendingQueuePolicy>

一段時間之後,broker列印出一資訊:

INFO MonetStore                     - Monet Store using

data directory C:\Activemq

5.1\bin\..

\data\localhost\tmp_storage

臨時檔案被放置在tmp_storage目錄下。

 

 

 

 

 

 

轉載: http://netcomm.iteye.com/blog/470585

相關文章