RocketMQ(三):架构设计

发布时间 2023-04-28 16:34:07作者: 无虑的小猪

  官网地址: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建立连接通道,开始消费消息。