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

在越来越多的网友对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=ReferenceDatafileId=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里的偏移位置,它主要是用来进行快速查找的。这里要重点说一下下面的问题,经常看到

有资料这样介绍“Anindexofmessagelocationsiscachedinmemorytofacilitatequickretrievalofmessagedata.Atconfigurablecheckpointintervals,thereferencesareinsertedintothepersistentreferencestore.”。这让很多朋友误以为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目录里的哪个文件中的具体位置了。

(本来指南针计划已经告一段落,但有些专题还没完成,应广大网友的要求,把一些专题补充上来了)

相关推荐