RocketMQ是一个分布式消息中间件,并支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念,如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。
RocketMQ以Topic来管理不同应用的消息,对于生产者(producer)而言,发送消息时需要指定消息的Topic,对于消费者(consumer)而言,在启动后需要订阅相应的Topic,然后可以消费相应的消息。Topic是逻辑上的概念,在物理实现上,一个Topic由多个Queue组成,采用多个Queue的好处是可以将Broker存储分布式化,提高系统性能。
首先来介绍下NameServer的功能,在RocketMQ的前身是使用ZooKeeper。NameServer用于管理所有Broker节点信息,接收Broker的注册/注销请求,此外还记录了Topic与Broker、Queue的对应关系,Broker主备信息。BrokerId为0代表是MasterBroker,否则BrokerId大于0的表示为SlaveBroker,Master和Slave组成一个Broker,具有相同的brokerName。Broker在启动的时候会去NameServer进行注册,会维护Broker的存活状态,Broker每次发送心跳过来的时候都会把Topic信息带上。NamesrvStartUp为启动类、NamesrvController为控制类、RouteInfoManager存放了Topic队列信息以及地址列表等一系列重要数据结构并提供了对应的数据变更接口、DefaultRequestProcessor负责处理所broker发过来的所有网络消息。各NameServer之间是相互独立且没有通信的,通过给Broker的namesrvAddr配置多个NameServer地址,同时向多个NameServer注册信息来实现NameServer集群。因为NameServer读写压力比较小,所以稳定性较高。相应的生产者/消费者中的namesrvAddr也是配置多个。
再来看看Broker,每个Broker都会和NameServer建立一个长连接保持心跳。一个Topic分布在多个Broker上,一个Broker可以配置多个Topic。由于消息分布在各个Broker上,一旦某个Broker宕机,则该Broker上的消息读写都会受到影响。所以需要HA机制,RocketMQ的实现方式是master/slave,salve定时从master同步数据,如