因群里的“追风”问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)
- 大小: 13.1 KB
- 大小: 12.5 KB
- 大小: 9.3 KB
分享到:
相关推荐
在“activemq_activemq_doublezoo_源码”这个主题中,我们主要关注两个关键概念:ActiveMQ的生产者和消费者API,以及ActiveMQ与Spring框架的整合。 1. **ActiveMQ生产者API**: 生产者是向消息队列发布消息的组件...
在IT领域,消息队列(Message Broker)是一个重要的组件,它允许分布式系统中的不同部分通过异步通信来解耦和协调工作。ActiveMQ是Apache软件基金会的一个开源项目,它是Java消息服务(JMS)的一个实现,广泛应用于...
JMSSession是生产和消费消息的一个单线程上下文,会话用于创建消息生产者(producer)、消息消费者(consumer)和消息(message)等。会话提供了一个事务性的上下文,在这个上下文中,一组发送和接收被组合到了一个...
首先,ActiveMQ是Apache软件基金会开发的一款开源消息代理,它是基于Java Message Service (JMS) 规范的。ActiveMQ支持多种协议,如OpenWire、AMQP、STOMP、MQTT和XMPP,使其能与各种编程语言和框架集成。在安装部署...
《ActiveMQ与Spring整合实战教程》 在Java企业级应用中,消息中间件扮演着至关重要的角色,它能够实现应用间的解耦,提高系统的可扩展性和可靠性。ActiveMQ作为Apache基金会的一个开源项目,是Java消息服务(JMS)...
ActiveMQ是Apache软件基金会开发的一个开源消息中间件,它遵循开放标准,如AMQP(Advanced Message Queuing Protocol)和JMS(Java Message Service),用于在分布式环境中提供高效率的消息传递服务。ActiveMQ允许...
标签:activemq-jmdns_1.0-5.4.0-sources.jar,activemq,jmdns_1.0,5.4.0,sources,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.4.0-javadoc.jar,activemq,jmdns_1.0,5.4.0,javadoc,jar包下载,依赖包
标签:activemq-jmdns_1.0-4.1.2.jar,activemq,jmdns_1.0,4.1.2,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.5.1.jar,activemq,jmdns_1.0,5.5.1,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.4.0.jar,activemq,jmdns_1.0,5.4.0,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.3.2.jar,activemq,jmdns_1.0,5.3.2,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.4.1.jar,activemq,jmdns_1.0,5.4.1,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.4.3.jar,activemq,jmdns_1.0,5.4.3,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.6.0.jar,activemq,jmdns_1.0,5.6.0,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.4.2.jar,activemq,jmdns_1.0,5.4.2,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.3.1.jar,activemq,jmdns_1.0,5.3.1,jar包下载,依赖包
标签:activemq-jmdns_1.0-5.1.0.jar,activemq,jmdns_1.0,5.1.0,jar包下载,依赖包