大致的存储过程

本文最后更新于:2022年7月29日 下午

由于消息存储篇幅过长,这里只指明大致的消息存储过程

大致的消息存储过程

存储文件

RocketMQ 的主要存储三个文件:

  1. CommitLog ,在 RocketMQ 的设计中,它存储了所有的消息
  2. ConsumerQueue ,每一个消息队列对应一个文件
  3. IndexFile ,加速了消息的检索速度

image-20210705221223338

存储过程

  1. 检查消息是否可以写入,如该Broker是Slave、磁盘已满、队列没有写权限则不能写入
  2. 检查是否是延时消息,如果是延时消息则保存具体的Topic信息、MessageID到消息体中,并替换为延时消息的Topic和MessageID
  3. 获取当前可以写入的CommitLog文件
  4. 申请 putMessageLock ,即写入文件是串行写入的
  5. 设置消息的存储时间,创建全局唯一的 Message ID
  6. 获取该消息在消息队列中的偏移量,重新计算消息的总长度,并写入Commit Log文件中,如果无法存储所有的内容则创建新的CommitLog
  7. 把消息写入到CommitLog中,根据配置文件进行刷盘
  8. 更新逻辑偏移量,并释放 putMessageLock
  9. 根据 CommitLog 偏移量、消息体大小、tag的hash值写入ConsumerQueue中
  10. 插入数据到IndexFile中
  11. Consumer Queue间隔一定时间刷盘

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!