RocketMQ基本概念

一、基础概念

1 消息服务器(Broker Server)

  • 消息中转角色,负责存储消息、转发消息。
  • Broker 在 RocketMQ 中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。
  • Broker 也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。

Broker包含了以下几个重要子模块:

diff 复制代码
- Remoting Module:整个 Broker 的实体,负责处理来自 Client 端的请求。
- Client Manager:负责管理客户端(Producer/Consumer)和维护 Consumer 的Topic订阅信息。
- Store Service:提供方便简单的API接口处理消息存储到物理硬盘和查询功能。
- HA Service:高可用服务,提供 Master Broker 和 Slave Broker 之间的数据同步功能。
- Index Service:根据特定的 Message key 对投递到Broker的消息进行索引服务,以提供消息的快速查

2 消息生产者(Producer)

  • 负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到 Broker 服务器。
  • RocketMQ 提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要 Broker 返回确认信息,单向发送不需要。

3 消息消费者(Consumer)

  • 负责消费消息,一般是后台系统负责异步消费。
  • 一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。提供了两种消费形式:拉取式消费、推动式消费。

(1) 拉取式消费(Pull Consumer)

消费消息的应用通常主动调用 Consumer 的拉消息方法从 Broker 服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费逻辑进行消息处理。

(2) 推动式消费(Push Consumer)

消费消息的应用不需要主动调用 Consumer 的拉消息方法,在 RocketMQ 底层已经封装了拉取的调用逻辑,在用户层面看来是 Broker 把消息推送过来的,其实底层还是 Consumer 去 Broker 主动拉取消息。

4 主题(Topic)

表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是 RocketMQ 进行消息订阅的基本单位。

5 名字服务(Name Server)

NameServer 是一个非常简单的 Topic 路由注册中心,其角色类似 Dubbo 中的 zookeeper,支持 Broker 的动态注册与发现。主要包括两个功能:

  • Broker 管理,NameServer 接受 Broker 集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活。
  • 路由信息管理,每个 NameServer 将保存关于 Broker 集群的整个路由信息和用于客户端查询的队列信息。然后Producer 和 Consumer 通过 NameServer 就可以知道整个 Broker 集群的路由信息,从而进行消息的投递和消费。

NameServer 通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker 是向每一台 NameServer 注册自己的路由信息,所以每一个 NameServer 实例上面都保存一份完整的路由信息。当某个 NameServer 因某种原因下线了,Broker 仍然可以向其它 NameServer 同步其路由信息,Producer 和 Consumer 仍然可以动态感知 Broker 的路由的信息。

二、其他概念

1 分组(Group)

(1) 生产者组(Producer Group)

  • 标识发送同一类消息的Producer,通常发送逻辑一致。发送普通消息的时候,仅标识使用,并无特别用处。
  • 主要作用用于事务消息:事务消息中如果某条发送某条消息的 Producer-A 宕机,使得事务消息一直处于PREPARED 状态并超时,则 Broker 会回查同一个 Group 的其它 Producer,确认这条消息应该 commit 还是 rollback。

(2) 消费者组(Consumer Group)

  • 标识一类 Consumer 的集合名称,这类 Consumer 通常消费一类消息,且消费逻辑一致。同一个 Consumer Group 下的各个实例将共同消费 topic 的消息,起到负载均衡的作用。

  • 消费进度以 Consumer Group 为粒度管理,不同 Consumer Group 之间消费进度彼此不受影响,即消息A被 Consumer Group1 消费过,也会再给 Consumer Group2 消费。

  • RocketMQ 支持两种消息消费模式:集群消费(Clustering)广播消费(Broadcasting)

    • 集群消费(Clustering)

    RocketMQ 认为任意一条消息只需要被消费组内的任意一个消费者处理即可。集群消费模式适用于每条消息只需 要被处理一次的场景,也就是说整个消费组会收到 Topic 的全量的消息,而消费组内的消费分担消费这些消息,因此可以通过扩缩消费者数量,来提升或降低消费能力,具体示例如下图所示,是最常见的消费方式。

    • 广播消费(Broadcasting)

    广播消费模式适用于每条消息需要被消费组的每个消费者处理 的场景,也就是说消费组内的每个消费者都会收到订阅Topic的全量消息,因此即使扩缩消费者数量也无法提升或降低消费能力,具体示例如下图所示。

二、RocketMQ 的集群架构

集群工作流程:

  • 启动 NameServer,等待 Broker、Producer、Consumer 连接,相当于一个路由控制中心。
  • Broker 启动,跟所有的 NameServer 保持长连接,定时发送心跳包。心跳包中包含当前 Broker 信息(IP+端口等)以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic 跟 Broker 的映射关系。
  • 收发消息前,先创建 Topic,创建 Topic 时需要指定该 Topic 要存储在哪些 Broker 上,也可以在发送消息时自动创建 Topic。
  • Producer 发送消息,启动时先跟 NameServer 集群中的其中一台建立长连接,并从 NameServer 中获取当前发送的 Topic 存在哪些 Broker 上,轮询从队列列表中选择一个队列,然后与队列所在的 Broker 建立长连接从而向 Broker 发消息。
  • Consumer 跟 Producer 类似,跟其中一台 NameServer 建立长连接,获取当前订阅 Topic 存在哪些Broker 上,然后直接跟 Broker 建立连接通道,开始消费消息。
相关推荐
许野平1 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
齐 飞2 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
LunarCod3 小时前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
码农派大星。3 小时前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man4 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*4 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu4 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s4 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子4 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
想进大厂的小王4 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构