在越来越多的网友对activeMQ的存储机制发生了兴趣,为了更好的对activeMQ的存储机制从实现原理进行分析,以知道怎么可以更好的进行优化。我们觉得有必要把我们在分析源码时的一些心得,分享给大家,首先activeMQ的消息存储目录相对简单:
在*\data目录下包括3个目录:journal、kr-store、临时目录(机器名称为目录名)
Journal
存放的是原始的消息内容,这个相对简单。
kr-store
这个目录里面是整个activeMQ消息存储机制最复杂的部分,它又分为俩个目录,data和state
State目录里主要存放的是,一些全局状态、或包含多少queue等信息,象有些朋友提到的有时候无法删除queue或activeMQ系统重启,会把所以存储的消息删除掉等问题,都和这个目录有关。
下面我们重点对data目录进行分析,它主要存放用来快速索引定位消息所需的数据的,下面我们重点介绍:
data-queue-data-*存储的内容是(*表示它会自动增加,从1开始):
1. msgID
2. 消息体存放在journal目录里data*文件的位置信息如
ReferenceRecord(id=ID:netcomm-183399d-4747-1250257550818-0:0:1:1:2,data=ReferenceData fileId=1, offset=20728448, expiration=0)
index-queue-data存储的内容是:
1. msgID在data-queue-data*的位置
2. msgID对应的ReferenceRecord在data-queue-data*的位置。
如offset=153, key=(1, 248, 49), value=(1, 302, 65), previousItem=102, nextItem=-1
hash-index-queue-data_queue#3a#2f#2fqueue.hello2(“queue.hello2”根据具体的queue或topic而变化)存储的内容是msgID和该msgID在index-queue-data里的偏移位置,它主要是用来进行快速查找的。这里要重点说一下下面的问题,经常看到
有资料这样介绍“An index of message locations is cached in memory to facilitate quick retrieval of message data. At configurable checkpoint intervals, the references are inserted into the persistent reference store.”。这让很多朋友误以为index是完全放在内存中的,其实不是,消息对应的索引是在需要的时候才会载入内存的,平时不需要的时候,都是放在这个文件里的。
data-container-roots-*存放的是这样的内容包括queue的名称等。
index-container-roots里面存放的是queue的名称在data-container-roots-1的位置+
该queue在index-queue-data里的root节点的偏移量。
activeMQ进行消息的查找的过程如下:
根据msgID计算出hash值,然后在hash-index-queue-data_queue#3a#2f#*里面找到对应的index,并从中得到消息在index-queue-data里存放的偏移量,然后从index-queue-data读出消息的ReferenceRecord结构体在data-queue-data-*里的位置信息,然后从data-queue-data-*里读出ReferenceRecord,从而知道消息具体存放在journal目录里的哪个文件中的具体位置了。
(本来指南针计划已经告一段落,但有些专题还没完成,应广大网友的要求,把一些专题补充上来了)
分享到:
相关推荐
在“activemq_activemq_doublezoo_源码”这个主题中,我们主要关注两个关键概念:ActiveMQ的生产者和消费者API,以及ActiveMQ与Spring框架的整合。 1. **ActiveMQ生产者API**: 生产者是向消息队列发布消息的组件...
现在我们来详细探讨Spring和ActiveMQ的整合以及消息的发布订阅机制。 首先,让我们理解什么是ActiveMQ。ActiveMQ是Apache软件基金会的一个项目,它是一款高性能、轻量级的消息中间件,支持多种协议,如OpenWire、...
ActiveMQ是Apache软件基金会旗下的一个开源消息中间件,它实现了Java消息服务(JMS)规范,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。JMS规范定义了一套API,用于在两个应用程序之间或者...
ActiveMQ是Apache软件基金会的一个开源项目,它是Java消息服务(JMS)的一个实现,广泛应用于企业级应用中。而Spring框架,作为一个Java平台的全功能模块化解决方案,提供了与ActiveMQ集成的能力,让开发者能够轻松...
ActiveMQ是一款功能强大的开源消息代理,支持多种协议,如OpenWire、STOMP、AMQP、MQTT等,适用于多种应用场景,包括点对点和发布/订阅模式的消息传递。其特性包括:高可用性、持久化、事务处理、安全控制以及丰富的...
同时,测试报告可能会对比分析不同消息队列在特定场景下的优缺点,为选择适合的队列服务提供参考。 总的来说,了解和掌握这些消息队列的使用和性能测试对于优化分布式系统的架构、提高系统效率和稳定性具有重要意义...
标签:activemq-jmdns_1.0-5.4.0-sources.jar,activemq,jmdns_1.0,5.4.0,sources,jar包下载,依赖包
ActiveMQ是Apache软件基金会开发的一个开源消息中间件,它遵循开放标准,如AMQP(Advanced Message Queuing Protocol)和JMS(Java Message Service),用于在分布式环境中提供高效率的消息传递服务。ActiveMQ允许...
2. **消息存储**:ActiveMQ提供了内存存储和磁盘存储两种方式。在源代码中,你可以看到如何管理消息队列,以及如何保证消息的持久性和事务一致性。 3. **网络通信**:ActiveMQ使用NIO(非阻塞I/O)进行网络通信,...
标签:activemq-jmdns_1.0-5.4.0-javadoc.jar,activemq,jmdns_1.0,5.4.0,javadoc,jar包下载,依赖包
在本压缩包"lwl-activemq.zip_activemq_collect6i1"中,包含了与ActiveMQ相关的源码以及启动和配置信息,特别是针对"collect6i1"的集成。以下将详细解析这些关键知识点。 1. **ActiveMQ消息发送源码**: ActiveMQ...
ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它基于开放标准的JMS(Java消息服务)协议,支持多种语言,包括C++。在本文中,我们将深入探讨ActiveMQ-CPP库的3.6.0版本,以及如何在C#环境中利用它进行消息...
**ActiveMQ实践入门指南** Apache ActiveMQ是一款开源的消息中间件,它是Java消息服务(JMS)的实现,广泛应用于分布式系统中的异步通信。ActiveMQ以其高性能、高可靠性和易于管理的特点,在企业级应用中备受青睐。...
标题"test_jms.zip_activemq_activemq案例_jms_jms test"中,我们可以看出这是关于一个与JMS(Java Message Service)相关的项目,使用了ActiveMQ作为消息中间件,并且包含了一些测试内容。"activemq案例"暗示这是一...
标签: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包下载,依赖包