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