ActiveMQ - message cursor
因群裡的“追風”問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
相關文章
- ActiveMQ 中的訊息遊標(Message cursors)MQ
- ActiveMQ第三彈:在Spring中使用內建的Message BrokerMQSpring
- ActiveMQMQ
- Message(Message Pool)原始碼分析原始碼
- ActiveMQ入門MQ
- 安裝activemqMQ
- ActiveMQ簡介MQ
- shared SQL,parent cursor,child cursorSQL
- ActiveMQ第四彈:在HermesJMS中建立ActiveMQ SessionMQSession
- ActiveMQ第二彈:使用Spring JMS與ActiveMQ通訊MQSpring
- 【CURSOR】Oracle 遊標 (cursor)知識梳理Oracle
- Zabbix監控ActiveMQMQ
- ActiveMQ之StompMQ
- ActiveMQ嵌入TomcatMQTomcat
- ActiveMq整合SpringMQSpring
- ActiveMQ筆記整理MQ筆記
- ActiveMQ初步安裝MQ
- ActiveMQ使用簡介MQ
- activemq測試類MQ
- ActiveMQ 與 SpringMQSpring
- ActiveMQ+MQTT+WebSocketMQQTWeb
- ActiveMQ初級教程MQ
- ActiveMQ持久化方式MQ持久化
- Spring 配置 ActiveMQSpringMQ
- Oracle CursorOracle
- Cursor使用
- open_cursor & session_cached_cursor實驗Session
- 理解V$OPEN_CURSOR,SESSION_CACHED_CURSORSession
- 理解V$OPEN_CURSOR, V$SESSION_CACHED_CURSORSession
- 淺談ActiveMQ與使用MQ
- Spring與ActiveMQ整合SpringMQ
- activeMQ個人理解總結MQ
- ActiveMq安裝和使用MQ
- ActiveMQ簡單介紹MQ
- ActiveMQ-mysql持久化MQMySql持久化
- ActiveMQ的初步瞭解MQ
- activemq升級報錯MQ
- ActiveMQ 引數優化MQ優化