消息从发送到存储再到消费的流程
-
消息发送
- 生产者 → Broker:生产者通过网络将消息发送到Broker。
-
消息存储
- Broker接收消息:Broker接收生产者发送的消息,并将其写入内存缓冲区。
- 写入CommitLog:Broker将消息编码为字节流,并顺序写入到
CommitLog文件。 - 更新ConsumeQueue:Broker根据消息的主题和队列ID,更新相应的
ConsumeQueue文件,记录消息在CommitLog中的物理偏移量、大小和Tag hashcode。 - 更新IndexFile(如果有key):如果消息带有key,Broker会计算key的哈希值,并将消息的物理偏移量和时间戳写入
IndexFile。
-
消息消费
- 消费者启动:消费者启动时,向NameServer获取主题的路由信息,并与Broker建立连接。
- 消费者拉取消息:消费者向Broker发送拉取消息的请求。
- Broker查找消息:
- 定位ConsumeQueue:Broker根据请求中的主题和队列ID,定位到相应的
ConsumeQueue文件。 - 读取消息索引:根据消费偏移量,从
ConsumeQueue文件中读取消息索引,获取消息在CommitLog中的物理偏移量和消息大小。
- 定位ConsumeQueue:Broker根据请求中的主题和队列ID,定位到相应的
- 读取CommitLog:Broker根据
ConsumeQueue文件中的索引信息,从CommitLog文件中读取实际的消息数据。 - 返回消息给消费者:Broker将读取到的消息数据返回给消费者。
- 消费者处理消息:消费者接收到消息后,调用注册的消息监听器处理消息,并更新消费进度。
流程图描述
生产者发送消息
|
v
+-----------------------+
| Broker接收消息 |
+-----------------------+
|
v
+-----------------------+
| 写入CommitLog |
+-----------------------+
|
v
+-----------------------+
| 更新ConsumeQueue |
+-----------------------+
|
v
+-----------------------+
| 更新IndexFile |
|(如果有key) |
+-----------------------+
|
v
+-----------------------+
|消费者启动并拉取消息 |
+-----------------------+
|
v
+-----------------------+
| Broker查找消息 |
+-----------------------+
|
v
+-----------------------+
| 定位ConsumeQueue |
+-----------------------+
|
v
+-----------------------+
| 读取消息索引 |
+-----------------------+
|
v
+-----------------------+
| 读取CommitLog |
+-----------------------+
|
v
+-----------------------+
| 返回消息给消费者 |
+-----------------------+
|
v
+-----------------------+
| 消费者处理消息 |
| 并更新消费进度 |
+-----------------------+
总结
通过上述流程图,可以清晰地看到消息在RocketMQ中的流转过程,包括消息的发送、存储到多个关键文件(CommitLog、ConsumeQueue 和 IndexFile)以及最终被消费者消费的过程。这种流程设计确保了消息的高效存储和快速消费,保证了RocketMQ系统的高性能和可靠性。