RocketMQ内,msg的生命周期

180 阅读2分钟

消息从发送到存储再到消费的流程

  1. 消息发送

    • 生产者Broker:生产者通过网络将消息发送到Broker。
  2. 消息存储

    • Broker接收消息:Broker接收生产者发送的消息,并将其写入内存缓冲区。
    • 写入CommitLog:Broker将消息编码为字节流,并顺序写入到 CommitLog 文件。
    • 更新ConsumeQueue:Broker根据消息的主题和队列ID,更新相应的 ConsumeQueue 文件,记录消息在 CommitLog 中的物理偏移量、大小和Tag hashcode。
    • 更新IndexFile(如果有key):如果消息带有key,Broker会计算key的哈希值,并将消息的物理偏移量和时间戳写入 IndexFile
  3. 消息消费

    • 消费者启动:消费者启动时,向NameServer获取主题的路由信息,并与Broker建立连接。
    • 消费者拉取消息:消费者向Broker发送拉取消息的请求。
    • Broker查找消息
      • 定位ConsumeQueue:Broker根据请求中的主题和队列ID,定位到相应的 ConsumeQueue 文件。
      • 读取消息索引:根据消费偏移量,从 ConsumeQueue 文件中读取消息索引,获取消息在 CommitLog 中的物理偏移量和消息大小。
    • 读取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中的流转过程,包括消息的发送、存储到多个关键文件(CommitLogConsumeQueueIndexFile)以及最终被消费者消费的过程。这种流程设计确保了消息的高效存储和快速消费,保证了RocketMQ系统的高性能和可靠性。