下图是RocketMQ在历年双11的消息流转体量:
单位:十亿
.RocketMQ的原理和架构RocketMQ消息队列的整体部署架构如下图所示:
RocketMQ消息队列集群中的几个角色:
NameServer:
命名发现服务,更新和路由发现broker;
其在RocketMQ中起着中转承接的作用,是一个无状态的服务,多个NameServer之间不通信。
Broker-Master:
broker消息主机服务器。
Broker-Slave:
broker消息从机服务器。
Producer:
消息生产者。
Consumer:
消息消费者。
RocketMQ集群的一部分通信如下:
Broker启动后需要完成一次将自己注册至NameServer的操作;
随后每隔0s时间定期向NameServer上报Topic路由信息;
消息生产者Producer作为客户端发送消息时候,需要根据Msg的Topic从本地缓存的TopicPublishInfoTable获取路由信息。
如果没有则更新路由信息会从NameServer上重新拉取;
消息生产者Producer根据所获取的路由信息选择一个队列(MessageQueue)进行消息发送;
Broker作为消息的接收者接收消息并落盘存储。
从上面可以看出在消息生产者,在Broker和NameServer间都会发生通信(这里只说了MQ的部分通信),因此如何设计一个良好的网络通信模块在MQ中至关重要,它将决定RocketMQ集群整体的消息传输能力与最终性能。
rocketmq-remoting模块是RocketMQ消息队列中负责网络通信的模块,它几乎被其他所有需要网络通信的模块(诸如rocketmq-client、rocketmq-broker、rocketmq-namesrv)所依赖和引用。
为了实现客户端与服务器之间高效的数据请求与接收,RocketMQ消息队列自定义了通信协议并在Netty的基础之上扩展了通信模块。
鉴于RocketMQ通信模块的底层源码是Netty实现的,在阅读RocketMQ的源码之前,建议读者先对Netty的多线程模型、JAVANIO模型均有一定的了解,以便快速理解RocketMQ源码。
1.源码目录结构介绍本文使用的RocketMQ版本是4.4.0,依赖的netty版本是4.0.4.Final.请参考:Netty基本原理
RocketMQ的代码结构图如下:
RocketMQ源码主要分为以下几个package:
rocketmq-broker:mq的核心,它能接收producer和consumer的请求,并调用store层服务对消息进行处理。HA服务的基本单元,支持同步双写,异步双写等模式。
rocketmq-client:mq客户端实现,目前官方仅仅开源了java版本的mq客户端,c++,go客户端有社区开源贡献。
rocketmq-