返回

RocketMQ 5.0 源码解析:CommitLog 设计与 wrotePosition、committedPosition 等重要属性关系图文详解

后端

RocketMQ 5.0 源码解析:CommitLog 设计与 wrotePosition、committedPosition 等重要属性关系图文详解

前言

RocketMQ 是 Apache 下的一个分布式消息系统,它具有高可靠、高性能、高可扩展的特点,被广泛应用于金融、电商、游戏等领域。

CommitLog 是 RocketMQ 中的核心组件之一,负责将消息持久化到磁盘。在本文中,我们将详细分析 CommitLog 的设计,以及 CommitLog 中包含的组件中的一些重要属性字段。

CommitLog 的设计

CommitLog 是一个分布式的存储系统,由多个 Segment 文件组成。每个 Segment 文件的大小为 1GB。当一个 Segment 文件写满后,将创建一个新的 Segment 文件。

CommitLog 的设计如下图所示:

+---------------------------------------------------------------------------------+
|                                  CommitLog                                   |
+---------------------------------------------------------------------------------+
|                                                                                 |
|  +-------------------+   +-------------------+   +-------------------+   |
|  | Segment 1       |   | Segment 2       |   | Segment 3       |   |
|  +-------------------+   +-------------------+   +-------------------+   |
|                                                                                 |
+---------------------------------------------------------------------------------+

CommitLog 中包含的组件

CommitLog 中包含了以下组件:

  • SegmentFile :SegmentFile 是 CommitLog 的基本存储单元,大小为 1GB。每个 SegmentFile 由多个 Page 组成。
  • Page :Page 是 SegmentFile 的最小存储单元,大小为 4KB。每个 Page 可以存储多个消息。
  • Message :Message 是 CommitLog 中存储的消息,由消息头和消息体组成。
  • IndexFile :IndexFile 是一个索引文件,用于快速定位消息。IndexFile 中存储了消息的偏移量和消息的长度。

CommitLog 中的重要属性字段

CommitLog 中包含了以下重要属性字段:

  • wrotePosition :wrotePosition 指的是当前写入的位置。
  • committedPosition :committedPosition 指的是已经提交的位置。
  • flushPosition :flushPosition 指的是已经刷新的位置。

wrotePosition、committedPosition 和 flushPosition 的关系

wrotePosition、committedPosition 和 flushPosition 的关系如下图所示:

+---------------------------------------------------------------------------------+
|                                  CommitLog                                   |
+---------------------------------------------------------------------------------+
|                                                                                 |
|  +-------------------+   +-------------------+   +-------------------+   |
|  | Segment 1       |   | Segment 2       |   | Segment 3       |   |
|  +-------------------+   +-------------------+   +-------------------+   |
|                                                                                 |
+---------------------------------------------------------------------------------+
|                                                                                 |
|                                              Wrote Position                     |
|                                              Committed Position                  |
|                                              Flush Position                      |
+---------------------------------------------------------------------------------+
  • wrotePosition 指的是当前写入的位置。当消息写入 CommitLog 后,wrotePosition 会增加。
  • committedPosition 指的是已经提交的位置。当消息被提交后,committedPosition 会增加。
  • flushPosition 指的是已经刷新的位置。当消息被刷新到磁盘后,flushPosition 会增加。

总结

在本文中,我们详细分析了 CommitLog 的设计,以及 CommitLog 中包含的组件中的一些重要属性字段。希望本文能够帮助您更好地理解 RocketMQ 的工作原理。