RocketMQ 技术内幕:消息存储

RocketMQ 主要存储的文件包括 Comitlog 文件、ConsumeQueue 文件、IndexFile 文件。

  • CommitLog:消息存储文件,所有消息主题的消息都存储在 CommitLog 文件中。
  • ConsumerQueue:消息消费队列,消息到达 CommitLog 文件后,将异步转发到消息消息队列,供消息消费者消费。
  • IndexFile:消息索引文件。

消息发送存储流程

消息存储入口:org.apache.rocketmq.store.DefaultMessageStore#putMessage

  • Step 1:如果当前 Broker 停止工作或 Broker 为 SLAVE 角色或当前 RocketMQ 不支持写入,则拒绝消息写入;如果消息主题长度超过 256 个字符、消息属性长度超过 65536 个字符将拒绝消息写入。
  • Step 2:如果消息的延迟等级大于 0,用延迟消息主题 SCHEDULE_TOPIC、消息队列 ID 更新原先消息的主题与队列。
  • Step 3:获取当先可以写入的 Commitlog 文件。CommitLog 文件存储目录为 ```${ROCKET_HOME}/store/commitlog 目录,每一个文件默认 1G,一个文件写满后再创建另外一个,以该文件中第一个偏移量为文件名,偏移量小于 20 位用 0 补齐。
  • Step 4:在写入 CommitLog 之前,先申请 putMessageLock,消息存储到 CommitLog 文件是串行的。
  • Step 5:设置消息的存储时间。
  • Step 6:将消息追加到 MappedFile 中。
  • Step 7:创建全局唯一消息 ID,消息 ID 有 16 字节。
  • Step 8:获取该消息在消息队列的偏移量。

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。