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 建立连接通道,开始消费消息。
相关推荐
IT_陈寒5 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码6 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo6 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志7 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..7 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects7 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰7 小时前
一些基础和问题解决
后端
陈随易7 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN7 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana7 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端