activemq有三種索引系統默認的是Store-based 參考文檔 http://activemq.apache.org/message-cursors.html
第一種索引Store-based
消息接收後,首先完成消息存儲的工作,判斷是否有空閒的內存可用,如果有的話,直接進入DisPatchQueue,如果沒有可用內存,維護一個指針,當需要消息的時候,直接從消息存儲的介質裏每次讀取一批消息,然後存入DisPatchQueue。(此消息存儲的大小取決於storeUsage+temUsage設置的大小)速度適中
第二種索引 VM Cursor
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntrytopic=">" producerFlowControl="true" memoryLimit="100mb">
<pendingSubscriberPolicy>
<vmQueueCursor/>
</pendingSubscriberPolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
消息接收後,首先完成消息存儲的工作,然後直接把消息存放在內存中的DisPatchQueue(此消息存儲的大小取決於memoryLimit設置的大小,沒有設置就是memoryLimit的大小,也就是 jvm的70%)。速度最快
第三種索引 File based Cursor
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntrytopic=">" producerFlowControl="true" memoryLimit="100mb">
<pendingSubscriberPolicy>
<fileQueueCursor/>
</pendingSubscriberPolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
消息接收後,首先完成消息存儲的工作是否有空閒的內存可用,如果有的話,消息直接進入DisPatchQueue,如果沒有可用內存,把消息寫入臨時文件中,當需要消息的時候,直接從臨時文件中讀寫一批,然後送入DisPatchQueue。(此消息存儲的大小取決如tempUsage的大小)速度最慢,慢消費者可以採用
測試結果(已下測試消息內容都是2KB,message3KB)
消息cursor類型 |
性能 |
穩定性 |
最佳使用場景 |
---|---|---|---|
Store-based |
當內存不夠時,需要進行1次消息存儲操作,性能在3種方式中居中 |
最好(storeUsage+temUsage使用完後假死)(12G保存3.5百萬) |
activeMQ默認使用該cursor,因爲它能滿足大部分場景需要 |
File |
當內存不夠時,需要進行2次消息存儲操作,並且在刪除消息的時候也就相應的要刪除2次,性能在3種方式中最差 |
居中(當tempUsage滿後假死) |
主要用在當消息存儲慢(如消息是放在數據庫裏),並且消費者相對快的情況下 |
VM |
在內存夠的情況下,3種message cursor性能一樣 |
如果不對隊列進行內存限制,消息在內存中消耗完jvm內存後假死(對隊列進行限制後不影響其他隊列) 1G內存 248142個消息 |
很快,適合消費慢需要抑制消息產生的場景,以及消費快的場景 |