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个消息 | 很快,适合消费慢需要抑制消息产生的场景,以及消费快的场景 |