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运行时内存结构
brokerLiveTable、clusterAddrTable运行时内存结构
2.消息发送
消息发送流程图
3.消息存储
3.1 3种文件结构
CommitLog文件、ConsumeQueue文件、Index文件
为了提高消息消费的效率,RocketMQ引入了ConsumeQueue消息消费队列文件,每个消息主题包含多个消息消费队列,每一个消息队列有一个消息文件。
Index索引文件的设计理念是为了加速消息的检索性能,根据消息的属性从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架构设计与实现原理》