浏览 3207 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-16
在*\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目录里的哪个文件中的具体位置了。 (本来指南针计划已经告一段落,但有些专题还没完成,应广大网友的要求,把一些专题补充上来了) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |