rocketmq注册、发送、存储、消费流程

1.路由中心NameServer

1.1 NameServer架构设计

在这里插入图片描述

1)Broker每隔30s向NameServer集群的每一台机器发送心跳包,包含自身创建的topic路由等信息。
2)消息客户端每隔30s向NameServer更新对应topic的路由信息。
3)NameServer收到Broker发送的心跳包时会记录时间戳。
4)NameServer每隔10s会扫描一次brokerLiveTable(存放心跳包的时间戳信息),如果在120s内没有收到心跳包,则认为Broker失效,更新topic的路由信息,将失效的Broker信息移除。

1.2 路由核心元数据

保存在RouteInfoManager中
1)topicQueueTable:topic消息队列的路由信息,消息发送时根据路由表进行负载均衡。
2)brokerAddrTable:Broker基础信息,包含brokerName、所属集群名称、主备Broker地址。
3)clusterAddrTable:Broker集群信息,存储集群中所有Broker的名称。
4)brokerLiveTable:Broker状态信息,NameServer每次收到心跳包时会替换该信息。

5)filterServerTable:Broker上的FilterServer列表,用于类模式消息过滤。类模式过滤机制在4.4及以后版本被废弃。
在这里插入图片描述
  RocketMQ基于订阅发布机制,一个topic拥有多个消息队列,一个Broker默认为每一主题创建4个读队列和4个写队列。
  多个Broker组成一个集群,BrokerName由相同的多台Broker组成主从架构,brokerId=0代表主节点,brokerId>0表示从节点。
  BrokerLiveInfo中的lastUpdateTimestamp存储上次收到Broker心跳包的时间。
topicQueueTable、brokerAddrTable运行时内存结构
      topicQueueTable、brokerAddrTable运行时内存结构

brokerLiveTable、clusterAddrTable运行时内存结构
      brokerLiveTable、clusterAddrTable运行时内存结构

2.消息发送

消息发送流程图
      消息发送流程图

3.消息存储

3.1 3种文件结构

  CommitLog文件、ConsumeQueue文件、Index文件
  为了提高消息消费的效率,RocketMQ引入了ConsumeQueue消息消费队列文件,每个消息主题包含多个消息消费队列,每一个消息队列有一个消息文件。
  Index索引文件的设计理念是为了加速消息的检索性能,根据消息的属性从CommitLog文件中快速检索消息。

CommitLog文件布局
          CommitLog文件布局
  可以通过二分法进行查找,快速定位这个文件的位置,然后用消息物理偏移量减去所在文件的名称,得到的差值就是在该文件中的绝对地址。

在这里插入图片描述
          ConsumeQueue文件结构
  ConsumeQueue文件是消息消费队列文件,是CommitLog文件基于topic的索引文件,主要用于消费者根据topic消费消息,其组织方式为/topic/queue,同一个队列中存在多个消息文件。
  ConsumeQueue的设计极具技巧,每个条目长度固定(8字节CommitLog物理偏移量、4字节消息长度、8字节tag哈希码)。

在这里插入图片描述
          Index文件存储结构
  Index文件基于物理磁盘文件实现哈希索引。Index文件由40字节的文件头、500万个哈希槽、2000万个Index条目组成,每个哈希槽4字节、每个Index条目含有20个字节,分别为4字节索引key的哈希码、8字节消息物理偏移量、4字节时间戳、4字节的前一个Index条目(哈希冲突的链表结构)

4.消息消费

4.1 并发消费流程

并发消费流程
  RocketMQ支持并发消费与顺序消费两种消费方式,消息的拉取与消费模型基本一致,只是顺序消费在某些环节为了保证顺序性,需要引入锁机制。
  一个MQ客户端(MQClientInstance)只会创建一个消息拉取线程向Broker拉取消息,并且同一时间只会拉取一个topic中的一个队列,拉取线程一次向Broker拉取一批消息后,会提交到消费组的线程池,然后不断地向Broker发起下一个拉取请求。
  RocketMQ客户端为每一个消费组创建独立的消费线程池,即在并发消费模式下,单个消费组内的并发度为线程池线程个数。线程池处理一批消息后会向Broker汇报消息消费进度。

4.2 消息拉取核心流程

消息拉取流程
可以分为3个主要步骤。
1)拉取客户端消息拉取请求并封装。
2)消息服务器查找消息并返回。
3)消息拉取客户端处理返回的消息。

5.注册、发送、存储、消费流程图

分别对路由管理、Broker启动、DefaultMQProducer发送消息、消息存储、DefaultMQPushConsumer消费消息源码做了整理。
在这里插入图片描述

https://www.processon.com/view/link/64a69f17b856374c5c0de6da

目前只是一刷,很多概念理解的还不是很透彻,另外主从同步和raft选举代码还未看。

参考资料:《RocketMQ技术内幕: RocketMQ架构设计与实现原理》

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paopaodog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值