因群里的“追风”问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目录下。 | 是 |
|
|
|
|
|
(有关activeMQ的相关问题,请加入我们,联系方式QQ:1054618780,email:yunweitec@yahoo.cn)