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目录里的哪个文件中的具体位置了。
(本来指南针计划已经告一段落,但有些专题还没完成,应广大网友的要求,把一些专题补充上来了)