RocketMQ事务消息及消息索引设计原理

129 阅读1分钟

RocketMQ事务消息

  • 正常事务消息的发送及提交

  • 事务消息的补偿流程

一阶段的half消息如何做到对用户不可见?

回滚之后 pending状态的消息如何变成最终状态

通过Op消息来确定提交或回滚事务的最终状态

Half消息的索引构建

一阶段存储的消息的内容
二阶段时恢复出一条完整的普通消息
然后走一遍消息写入流程

消息查询

按照MessageId查询消息

客户端通过messageId得到broker地址
然后再通过commitlog offset读取真正的记录

按照Message Key查询消息

index索引文件组成

文件大小是固定的等于40+500W*4+2000W*20420000040个字节大小
  • Header
保存一些总的统计信息
  • Slot Table
不保存真正的索引数据,而是保存每个槽位对应的单向链表的头
  • 20*2000W
20*2000W 是真正的索引数据
即一个 Index File 可以保存 2000W个索引。

类似于HashMap数组+链表的数据结构

每个索引结构

Timestamp记录的是消息storeTimestamp之间的差
并不是一个绝对的时间