首页 > 其他 > 详细

消息消费队列和索引文件的更新

时间:2020-01-27 00:47:27      阅读:128      评论:0      收藏:0      [点我收藏+]

ConsumeQueue,IndexFile需要及时更新,否则无法及时被消费,根据消息属性查找消息也会出现较大延迟。

mq通过开启一个线程ReputMessageService来准时转发commitLog文件更新事件,相应的任务处理器根据转发的消息及时更新ConsumeQueue,IndexFile文件

DefaultMessageStore#start

技术分享图片

 

 

 

技术分享图片

 

 

 

技术分享图片

 

ReputMessageService线程每执行一次任务推送休息1毫秒旧继续尝试推送消息到消息消费队列和索引文件。

技术分享图片

 

 

技术分享图片

 

返回reputFromOffset偏移量开始的全部有效数据,然后循环读取每一条消息。

 

 

 

 

技术分享图片

 

在DefaultMessageStore的构造方法中:

技术分享图片

 

 

技术分享图片

topic:消息主题名称

queueId:消息队列ID

commitLogOffset:消息物理偏移量

msgSize:消息长度

tagsCode:消息过滤tag hashcode

storeTimestamp:消息存储时间戳

consumeQueueOffset:消息队列偏移量

key:消息索引

success:是否成功解析道完整的消息

uniqKey:消息唯一键

sysFlag:消息系统标记

preparetransactionOffset:消息预处理事务偏移量

propertiesMap:消息属性

bitMap:位图

 

技术分享图片

 

 

 

技术分享图片

 

根据消息主题与队列ID,先获取对应的ConsumeQueue文件。

技术分享图片

 

最后会调用这个方法,一次将消息偏移量,消息长度,tag hashcode写入到ByteBuffer中,并根据consumeQueueOffset计算ConumeQueue中的物理地址,将内容追加到ConsumeQueue的内存映射文件中,ConsumeQueue的刷盘方式固定为异步刷盘模式

 

 

技术分享图片

 

如果messageIndexEnable设置为true。

技术分享图片

 

获取或创建IndexFile文件并获取所有文件最大的物理偏移量。如果该消息的物理偏移量小于索引文件中的物理偏移量,则说明是重复数据,忽略本次索引构建。

 

技术分享图片

 

如果消息的唯一键不为空,则添加到Hash索引中,以便加速根据唯一键检索消息

 

 

技术分享图片

 

构建索引键,mq支持为同一个消息建立多个索引,多个索引键空格分开。

消息消费队列和索引文件的更新

原文:https://www.cnblogs.com/lccsblog/p/12235294.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!