网站首页 > 博客文章 正文
1. 核心角色 (四大金刚)
这是 RocketMQ 分布式架构的四个基本组成部分。
1.1 NameServer (名称服务)
- 是什么?
NameServer 是一个功能非常轻量级的服务注册与发现中心。它本身不存储任何业务数据(比如消息),只存储 RocketMQ 集群的“元数据”。 - 为什么需要它?
在分布式系统中,各个组件(生产者、消费者、Broker)需要知道彼此的地址才能通信。NameServer 就扮演了这个“通讯录”或“DNS服务”的角色。它解决了以下问题: - Broker(消息服务器)如何被生产者和消费者发现?
- 当 Broker 宕机或扩容时,其他组件如何动态感知?
- 如何工作?
- Broker 注册: Broker 启动后,会定期向 NameServer 集群发送心跳,报告自己的存活状态和所管理的 Topic 信息。
- 路由发现: 生产者和消费者启动时,会从 NameServer 获取它们需要访问的 Topic 所在的 Broker 列表。
- 无状态与解耦: NameServer 集群中的节点之间互不通信,是对等的。任何一个 NameServer 宕机,只要还有一个存活,整个集群就能正常工作。这种设计使得 NameServer 非常稳定且易于水平扩展。
类比: NameServer 就像一个机场的“航班信息大屏”。航空公司(Broker)会把自己的航班信息(Topic 路由)更新到大屏上,而旅客(Producer/Consumer)通过查看大屏来知道要去哪个登机口(Broker)乘坐飞机。
1.2 Broker (消息存储与中转)
- 是什么?
Broker 是 RocketMQ 的核心,负责接收、存储和转发消息。所有的消息都由 Producer 发送到 Broker,再由 Broker 投递给 Consumer。 - 关键职责:
- 消息持久化: 将消息高效地写入磁盘,确保消息不丢失。
- 消息转发: 根据消费者的订阅关系,将消息投递给对应的消费者。
- 高可用性: 支持主从(Master/Slave)架构。Master Broker 负责读写,Slave Broker 从 Master 同步数据作为备份。当 Master 宕机时,可以(在某些模式下)切换到 Slave,保证服务连续性。
- 负载均衡: 一个 Topic 的消息可以分布在多个 Broker 上,分摊存储和读写压力。
1.3 Producer (生产者)
- 是什么?
消息的发送方。应用程序通过 Producer 将业务数据封装成消息,发送到 Broker。 - 关键概念:Producer Group (生产者组)
- 一个逻辑概念,代表了发送同一类消息的生产者实例集合。
- 用途:
- 标识: 方便运维管理和问题排查。
- 事务消息: 当 Broker 回查不确定的事务消息时,会从组内任意一个 Producer 实例进行回查。
1.4 Consumer (消费者)
- 是什么?
消息的接收方。应用程序通过 Consumer 从 Broker 拉取消息并进行业务处理。 - 关键概念:Consumer Group (消费者组)
- 一个非常重要的概念,代表了消费同一类消息的消费者实例集合。
- 消费模式由消费者组决定:
- 集群消费 (Clustering): 一个消费者组内的所有消费者共同分担对一个 Topic 的消费。一条消息只会被组内的某一个消费者实例处理。这是实现负载均衡和容错的关键。
- 广播消费 (Broadcasting): 一个消费者组内的所有消费者都会收到该 Topic 的全量消息。即一条消息会被组内的每一个消费者实例都处理一次。
类比:
集群消费就像一群工人在一个仓库(Topic)里搬运包裹(Message)。为了提高效率,每个工人只负责一部分包裹,大家合力完成整个任务。一个工人倒下了,其他工人会接替他的工作。
广播消费就像公司给每个员工群发了一封邮件通知。每个员工都会收到并阅读这封邮件。
2. 消息模型 (基本构成)
2.1 Message (消息)
- 是什么?
在网络上传输的数据单元。RocketMQ 的消息是带有一系列属性的字节数组。 - 核心属性:
- Topic (主题): 消息的逻辑分类,是消息订阅的基本单位。
- Tags (标签): 对 Topic 的进一步细分,用于在消费端进行消息过滤。
- Keys (键): 业务相关的索引键,方便快速查找特定消息。
- Body (消息体): 真正的业务数据,以字节数组形式存储。
2.2 Topic (主题)
- 是什么?
消息的第一级逻辑分类。生产者将消息发送到指定的 Topic,消费者订阅指定的 Topic 来接收消息。
类比: Topic 就像一个邮箱地址(如 orders@company.com),所有关于订单的消息都发到这里。
2.3 Tag (标签)
- 是什么?
消息的第二级逻辑分类,隶属于 Topic。它允许消费者在订阅 Topic 的基础上,只消费带有特定 Tag 的消息。 - 为什么需要它?
假设一个 Trade Topic 包含了订单、支付、退款等多种消息。如果一个系统只关心支付成功 (PaySuccess) 的消息,它就可以订阅 Trade Topic 并指定只消费 PaySuccess Tag 的消息。这样可以避免接收并丢弃大量不相关的消息,提高效率。
类比: 如果 Topic 是邮箱地址,Tag 就像邮件的“主题行”或“标签”,让你能快速筛选出你关心的邮件。
2.4 Message Queue (消息队列)
- 是什么?
这是消息存储的物理单元。一个 Topic 可以包含一个或多个 Message Queue。这些 Queue 可以分布在不同的 Broker 上。 - 关键作用:
- 并行度: 生产者可以并行地向多个 Queue 发送消息,消费者也可以并行地从多个 Queue 拉取消息。Queue 的数量决定了消费的并行度上限。
- 顺序性: 在单个 Message Queue 内部,消息是严格按照先进先出(FIFO)的顺序存储和消费的。
3. 重要机制与特性
3.1 消息发送方式
- 同步发送 (Sync): 生产者发送消息后,会阻塞等待,直到 Broker 返回成功或失败的响应。适用于需要强一致性、对结果非常敏感的场景。
- 异步发送 (Async): 生产者发送消息后,不阻塞,立即返回。它通过回调函数来处理 Broker 的响应。适用于对响应时间敏感、需要高吞吐量的场景。
- 单向发送 (One-way): 生产者发送消息后,不等待任何响应,也不触发回调。就像“扔出去就不管了”。适用于日志收集等允许少量消息丢失的场景。
3.2 顺序消息 (Ordered Message)
- 是什么?
RocketMQ 可以保证消息的消费顺序与发送顺序一致。 - 分类:
- 分区有序 (Partition Ordered): 保证同一个 Message Queue 内的消息有序。这是 RocketMQ 主要支持的模式。通过将同一业务 ID(如同一笔订单的创建、支付、完成消息)的消息发送到同一个 Queue 中来实现。
- 全局有序 (Global Ordered): 保证一个 Topic 内的所有消息都严格有序。这需要将 Topic 配置为只有一个 Message Queue,会严重牺牲性能,极少使用。
3.3 延时消息 (Scheduled Message)
- 是什么?
允许生产者发送一条消息,并期望它在未来的某个特定时间点才被消费者消费。 - 如何实现?
RocketMQ 内部通过一个名为 SCHEDULE_TOPIC_XXXX 的特殊 Topic 来实现。当发送延时消息时,Broker 会先将消息存入这个特殊 Topic,并根据延时等级等待。时间到达后,再将消息重新投递到原始的业务 Topic 中,此时消费者才能拉取到它。
3.4 事务消息 (Transactional Message)
- 是什么?
用于解决分布式事务中的最终一致性问题。它能保证本地事务操作和消息发送这两个动作要么都成功,要么都失败。 - 典型场景: 用户在电商网站支付成功后,需要通知积分系统增加积分。
- 两阶段提交过程:
- 发送 Half (Prepare) 消息: 生产者先向 Broker 发送一条“半消息”。这条消息对消费者不可见。
- 执行本地事务: 生产者执行本地数据库操作(如更新订单状态)。
- 提交/回滚:
- 如果本地事务成功,生产者向 Broker 发送 Commit 命令,Broker 将半消息标记为可投递,消费者即可消费。
- 如果本地事务失败,生产者向 Broker 发送 Rollback 命令,Broker 将删除该半消息。
- 事务状态回查: 如果生产者在第 2 步后宕机,没有发送 Commit 或 Rollback,Broker 会定期向生产者组内的其他实例发起“回查”,询问该事务的最终状态,以决定是提交还是回滚半消息。
3.5 消息存储 (CommitLog & ConsumeQueue)
RocketMQ 的高性能存储得益于其精巧的设计:
- CommitLog: 所有 Topic 的消息都不加区分地顺序写入这一个或多个大文件中。这种纯粹的顺序写大大提升了磁盘 I/O 性能。
- ConsumeQueue: 这是一个逻辑队列,可以看作是 CommitLog 的索引文件。每个 Topic 的每个 Queue 都有一个对应的 ConsumeQueue 文件。它里面并不存储完整的消息,只存储消息在 CommitLog 中的物理偏移量 (offset)、消息大小 (size) 和 Tag 的哈希码。
- 读写流程:
- 写: 消息直接顺序写入 CommitLog。
- 读: 消费者先读取 ConsumeQueue 获取索引信息,然后再根据索引去 CommitLog 的指定位置读取完整的消息内容。这种设计将随机读转换为了对 ConsumeQueue 的顺序读和对 CommitLog 的随机读,并且由于 ConsumeQueue 文件很小,可以被大量缓存到内存,极大地提升了读取性能。
简单概括一下工作流程:
- 启动: NameServer 集群首先启动。然后 Broker 启动,并向所有 NameServer 注册自己。
- 生产者发送消息:
- Producer 启动,从 NameServer 获取目标 Topic 的路由信息(即该 Topic 有哪些 Queue,分布在哪些 Broker 上)。
- Producer 根据负载均衡策略选择一个 Message Queue,将消息发送给对应的 Broker。
- Broker 将消息写入 CommitLog,并同步更新 ConsumeQueue 索引。
- 消费者消费消息:
- Consumer 启动,从 NameServer 获取其订阅 Topic 的路由信息。
- Consumer 根据消费模式(集群或广播)和负载均衡策略,决定自己负责消费哪些 Message Queue。
- Consumer 向对应的 Broker 发起长轮询(Long Polling)拉取请求。
- Broker 从 ConsumeQueue 找到新消息的索引,再从 CommitLog 中读取消息内容,返回给 Consumer。
- Consumer 处理完消息后,向 Broker 提交消费位点(Offset),以便下次知道从哪里继续消费。
希望这份详细的解释能帮助你全面理解 RocketMQ 4.9.0 的核心概念。
猜你喜欢
- 2025-07-21 开源|一款类excel报表设计系统,支持拖拽式和word模板设计
- 2025-07-21 SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!
- 2025-07-21 云端藏经阁:一款开源、精美、可独立部署的知识管理神器
- 2025-07-21 电商秒杀/库存扣减:基于JUC的并发控制实战案例
- 2025-07-21 简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ
- 2025-07-21 亿级分库分表,如何丝滑扩容、如何双写灰度
- 2025-07-21 使用mq实现分布式事务-补偿事务一致性
- 2025-07-21 【RocketMQ】消息的拉取(rocketmq消息大小)
- 2025-07-21 RocketMQ消息消费-客户端拉取消息前的准备工作
- 2025-07-21 RocketMQ消费限流的几种方式(rocketmq并发消费与顺序消费)
你 发表评论:
欢迎- 最近发表
-
- 谷歌云推出印度尼西亚“BerdAIa for Security”网络安全计划
- 谷歌:已解决全球服务中断问题,受影响平台涉及Spotify、Discord等
- 不再单一依赖英伟达,OpenAI被曝开始租用谷歌AI芯片训练ChatGPT
- 谷歌云代理商:怎样通过谷歌云服务器搭建社交平台?
- 谷歌云服务遭遇全球性宕机,影响多家互联网巨头
- OpenAI正式将谷歌云纳入供应商名单
- 谷歌给Agent造了个“微信”,和MCP功能互补,多智能体协作更顺畅了
- OpenAI“去微软化”加速:最新引入谷歌(GOOGL.US)构建混合云生态
- 谷歌给Agent造了个“微信”,和MCP功能互补,多智能体协作更顺畅
- 谷歌与OpenAI携手:云合作背后的机遇与隐忧
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- 系统设计图 (58)
- powershellfor (73)
- messagesource (71)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)