论坛首页 Java企业应用论坛

activeMQ指南针_消息存储机制_Kaha存储机制原理分析

浏览 3201 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-16  
   在越来越多的网友对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目录里的哪个文件中的具体位置了。
     (本来指南针计划已经告一段落,但有些专题还没完成,应广大网友的要求,把一些专题补充上来了)
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics