【mq读书笔记】消息消费队列和索引文件的更新
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支持为同一个消息建立多个索引,多个索引键空格分开。
最新文章
- [转载]C#深入分析委托与事件
- Flash Professional 报错 TypeError: Error #1034: 强制转换类型失败:无法将 xxxx@zzzz 转换为 yyy
- RAC Concept
- 在编译php事务时候出现如下错误,具体原因不知,不过解决了
- SQL Server执行计划的理解【转】
- SO_REUSEADDR 和 SO_REUSEPORT
- Delphi For Android 开发笔记-附:如何Delphi中同时实现Windows、Android版的GetModuleFileName函数
- hdu 1429 胜利大逃亡(续) (bfs+状态压缩)
- JavaSE基础问答
- linux设备和驱动加载的先后顺序
- js中window对象的opener属性的一个坑
- 刚发现 CSS 还存在一个命名规范 B.E.M
- 当linux报 “-bash: fork: 无法分配内存”
- UISplitViewController使用
- Android 自定义类型文件与程序关联
- Sublime远程连接Linux
- ssh 将22端口换为其它 防火墙设置
- 16.Mysql SQL Mode
- nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)
- 《Java 程序设计》课堂实践项目-简易计算器