RocketMQ(三):架构设计
官网地址:RocketMQ官网架构设计地址。
一、技术架构
1.1、RocketMQ整体技术架构图
1.2、技术架构的组成
RocketMQ从技术架构上分为四部分,分别为Producer(生产者)、Consumer(消费者)、BrokerServer(服务实例)、NameServer(Topic路由注册中心)。
1、消息发布 - Producer
Producer在RocketMQ中负责消息的投递,支持分布式集群部署。
Producer通过RocketMQ的负载均衡模块选择对应的Broker集群队列进行消息投递。
2、消息消费 - Consumer
Consumer在RocketMQ中负责消息消费,提供实时消息订阅机制,支持分布式集群部署。
支持消费消息的模式:push推送模式、pull拉取模式。
支持消费消息的方式:集群方式、广播方式。
2.1、push推模式
应用不需要主动调用Consumer的拉消息方法,在底层已经封装了拉取的调用逻辑,在用户层面看来是broker把消息推送过来的,其实底层还是consumer去broker主动拉取消息。
2.2、pull拉模式
应用通常主动调用Consumer的拉消息方法从Broker服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费过程。
3、服务实例 - BrokerServer
Broker在RocketMQ中负责消息的存储、投递、查询及服务高可用的保证。主要有以下5个模块:
3.1、远程处理模块 - Remoting Module
Broker实体,负责处理来自Client的请求
3.2、客户端管理器 - Client Manager
管理客户端(Producer/Consumer)和维护Consumer的Topic订阅信息。
3.3、消息存储服务 - Store Service
通过API接口实现 消息存储(持久化存储消息至物理硬盘)、消息查询功能
3.4、高可用服务 - HA Service
主从数据同步机制,提供Master Broker和Slave Broker之间的数据同步机制。
3.5、索引服务 - Index Service
通过Message Key对投递到Broker的消息进行索引服务,提供消息的快速查询。
4、 NameServer
NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。主要功能:Broker管理、路由信息管理。
支持集群方式部署,NameServer实例之间相互不进行信息通讯。
4.1、Broker管理
NameServer接受Broker集群的注册信息,将注册信息保存下来作为路由信息的元数据。提供心跳检测机制,检测Broker是否存活。
4.2、路由信息管理
NameServer保存Broker集群的整个路由信息,用于客户端查询队列信息。客户端(Producer/Consumer)可通过NameServer知道整个Broker集群的路由信息,进行消息的投递和消费。
Broker在启动时,向每一个NameServer注册自己的路由信息,每一个NameServer实例上都保存一份完整的路由信息。当某个NameServer下线了,Broker仍然可以向其它NameServer同步其路由信息,客户端(Producer/Consumer)仍然可以动态感知Broker的路由的信息。
二、部署架构
2.1、RocketMQ的部署架构图
2.2、各架构组成的部署特点
1、NameServer
NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
2、Broekr
在集群部署中,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。
每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。
RocketMQ在Broker的部署架构上支持一Master多Slave,只有BrokerId=1的从服务器才会参与消息的读负载。
3、Producer
Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic 服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
Producer在集群部署模式下,只能向Master进行消息投递。
4、Consumer
Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。
Consumer既可以从Master订阅消息,也可以从Slave订阅消息,消费者在向Master拉取消息时,Master服务器会根据拉取偏移量与最大偏移量的距离,以及从服务器是否可读等因素建议下一次是从Master还是Slave拉取。
Consumer在集群部署模式下,既可以从Master中消费、也可以从Slave中消费。
2.3、集群工作流程
1、启动NameServer
NameServer相当于路由控制中心,NameServer启动后监听端口,等待Broker、Producer、Consumer连上来。
2、启动Broker
Broker启动,会同所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
3、创建Topic
Topic作为RocketMQ中的隔离边界,在投递/消费消息前,优先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
4、投递消息 - Producer
Producer发送消息,启动时先与NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
5、消费消息
Consumer消费消息,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。