activeMQ消息存储机制

来源:互联网 发布:sap数据归档 编辑:程序博客网 时间:2024/05/15 09:13

 在越来越多的网友对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目录里的哪个文件中的具体位置了。 
原创粉丝点击