文章目录
一、系统架构
RocketMQ架构上主要分为四部分构成:
1、Producer
消息生产者,负责生产消息。Producer 通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递,投递的过程支持快速失败并且低延迟。
例:
- 电商平台中用户提交的秒杀请求写入到MQ的过程,就是消息生产的过程。
RocketMQ 中的消息 Producer 都是以 Producer Group 的形式出现的。Producer Group 是同一类 Producer 的集合,这类 Producer 发送相同 Topic 类型的消息。一个 Producer Group 可以同时发送多个主题的消息。
2、Consumer
消息消费者,负责消费消息。一个消息消费者会从 Broker 服务器中获取到消息,并对消息进行相关业务处理。支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式和广播方式的消费
RocketMQ 中的 Consumer 都是以 Consumer Group 的形式出现的。Consumer Group 是同一类 Consumer 的集合,这类 Consumer 消费的是同一个 Topic 类型的消息。Consumer Group在消息消费方面,实现负载均衡和容错的目标变得非常容易。
消费者组中Consumer的数量应该小于等于订阅Topic的Queue数量。如果超出Queue数量,则多出的Consumer将不能消费消息。
3、Name Server
NameServer 是一个 Broker 与 Topic 路由的注册中心,支持 Broker 的动态注册与发现。
两个功能:
- Broker管理:接受 Broker 集群的注册信息并且保存下来作为路由信息的基本数据;提供心跳检测机制,检查 Broker 是否还存活
- 路由信息管理:每个 NameServer 中都保存着 Broker 集群的整个路由信息和用于客户端查询的队列信息。Producer 和 Conumser 通过 NameServer 可以获取整个 Broker 集群的路由信息,从而进行消息的投递和消费
路由注册
NameServer 是以集群的方式部署,但 NameServer 是无状态,NameServer 集群中的各个节点间是无差异、相互不进行信息通讯的。
在 Broker 节点启动时,轮询 NameServer 列表,与每个 NameServer 节点建立长连接,发起注册请求。在 NameServer 内部维护着⼀个 Broker 列表,用来动态存储 Broker 的信息。
路由剔除
当 Broker 关机、宕机或网络等,NameServer 没有接收到 Broker 心跳时,NameServer 将其从 Broker 列表中剔除。
NameServer 中存在定时任务,每10秒就会扫描⼀次 Broker 列表,查看每个 Broker 的最新心跳时间戳距离当前时间是否超过120s,如果超过会判定 Broker 失效,将其从 Broker 列表中剔除。
路由发现
RocketMQ 的路由发现采用的是 Pull 模型。当 Topic 路由信息出现变化时,NameServer 不会主动推送给客户端,而是客户端定时拉取 Topic 最新的路由。默认客户端每30秒会拉取一次最新的路由。
4、Broke Server
Broker 在 RocketMQ 系统中负责接收并存储从 Producer 发送来的消息,同时为 Consumer 的拉取请求作准备。Broker 同时也存储着消息相关的元数据,包括 Consumer Group 消费进度偏移 offset、Topic、Queue。
Broker Server 的子模块:
- Remoting Module:Broker的实体,负责处理来自clients端的请求。
- Client Manager:客户端管理器。负责接收、解析客户端(Producer/Consumer)请求,管理客户端。维护Consumer的Topic订阅信息;
- Store Service:存储服务。提供方便简单的API接口,处理消息存储到物理硬盘和消息查询功能;
- HA Service:高可用服务,提供Master Broker 和 Slave Broker之间的数据同步功能;
- Index Service:索引服务。根据特定的Message key,对投递到Broker的消息进行索引服务,同时也提供根据Message Key对消息进行快速查询的功能。
RocketMQ 文档