MQ 概述

一. 什么是消息队列:核心定位与本质

  • 消息队列(Message Queue,简称 MQ)是分布式系统中实现异步通信的中间件。其本质是一个“带存储能力且遵循先进先出(FIFO)原则的智能中转站”,用于在生产者(Producer)与消费者(Consumer)之间可靠地传递消息。

  • 可以把它想象成一个“智能信箱”:生产者将消息投入信箱即可离开,消费者按自己的节奏取出处理,双方既不需要同时在线,也不必知道对方的存在。基于生产者-消费者模型,MQ 将服务或进程间同步、紧耦合的 RPC(Remote Procedure Call,远程过程调用)转化为异步、松耦合的消息传递,从而成为微服务、高并发、事件驱动架构的核心基础设施。

核心特质

  • 异步通信:生产者发送消息后无需等待消费者处理完成,即可继续执行

  • 解耦:生产者和消费者通过消息队列间接通信,互不依赖对方的实现和可用性

  • 缓冲:可暂存消息,平滑应对突发流量,避免下游被瞬间冲垮

  • 持久化:消息可保存到磁盘,即使系统崩溃也不会丢失

  • 可靠性:提供消息确认机制(ACK),确保消息被正确处理

一句话理解:以异步、缓冲、解耦的设计,牺牲实时强一致性,换取系统的高可用、高吞吐与高可扩展性

二、为什么需要 MQ:传统同步架构的痛点

在没有消息队列的传统同步架构中,服务之间通过直接调用进行通信,存在以下严重问题:

  1. 强耦合:一个服务的修改会影响所有依赖它的服务

    • 例如:订单服务需要调用库存、支付、物流、通知等多个服务

    • 新增一个服务(如积分服务)时,必须修改订单服务的代码

    • 任何一个下游服务故障,都会导致整个订单流程失败

  2. 性能瓶颈:同步调用会阻塞主线程,响应时间是所有服务调用时间的总和

    • 例如:订单服务调用库存(100ms) + 支付(200ms) + 物流(150ms) + 通知(50ms) = 500ms

    • 高并发下,大量线程被阻塞,系统吞吐量急剧下降

  3. 无法应对突发流量:系统的处理能力是固定的,当流量突然激增时,会直接被打垮

    • 例如:电商秒杀活动,每秒上万个请求同时到达,数据库瞬间被压垮

三、 MQ 的四大核心价值

1. 解耦:让服务独立进化

核心思想:将同步调用转换为异步消息传递,服务间只依赖共有的消息格式(契约),不依赖对方的实现、位置和可用性。

示例:电商订单系统

  • 传统方式:订单服务需串行调用库存、支付、物流、通知等模块,任何下游故障或接口变更都会拖累整个流程。

  • MQ 方式:订单服务将“订单已创建”事件发往 MQ,各下游服务自行订阅并消费,订单服务并不感知下游的存在。

价值

  • 新增积分、风控等业务时,只需让它们订阅对应主题,无需修改订单服务核心代码。

  • 物流服务若因发布而短暂宕机,订单服务仍可正常创建订单,消息暂存于队列,待恢复后继续处理。

  • 各服务可独立部署、扩容、升级,团队间协作成本显著降低。

2. 异步:提升系统响应速度

核心思想:将耗时、非实时的子流程从主业务线程中剥离,交由消费者异步处理,让主流程快速返回,提升单位时间内的请求吞吐量。

示例:用户注册

  • 传统方式:用户提交注册 → 写库 → 同步发送欢迎邮件 → 同步发送短信通知 → 返回成功(总耗时约 500 ms)。

  • MQ 方式:用户提交注册 → 写库 → 发送“用户注册成功”消息至 MQ → 立即返回成功(耗时降至约 100 ms)。邮件、短信服务异步消费消息,各自完成推送。

价值

  • 接口响应时间显著缩短,用户体验更流畅,并发能力大幅提升。

  • 主线程不再被阻塞等待非核心操作,系统资源利用率更高。

  • 可根据下游处理压力灵活增减消费者实例,实现动态吞吐平衡。

3. 削峰填谷:平稳应对流量波动

核心思想:利用 MQ 作为缓冲层,将突发的高峰请求暂存起来,让后端消费者按照自身固定能力匀速拉取处理,避免瞬时流量冲垮系统。

类比:水库原理

  • 雨季(流量高峰):水库蓄水,保护下游河道不泛滥。

  • 旱季(流量低谷):水库放水,保持下游水流平稳不断。

示例:秒杀活动

  • 10 万并发请求瞬间涌入,若直达数据库,会直接导致连接占满、系统崩溃。

  • 引入 MQ 后,所有请求先写入队列,订单处理服务按每秒 1000 条的速度稳定消费,多余请求在队列中排队,前端可提示用户“排队中”。

价值

  • 系统可承受远超自身处理能力的瞬时流量,不发生雪崩。

  • 避免为应对峰值而长期冗余部署资源,降低硬件成本。

  • 流量低谷时队列中的积压可被消化,实现资源均衡利用。

4. 事件驱动与数据最终一致性:构建可靠的多服务联动

核心思想:将业务状态变更封装为标准事件消息广播,各服务独立响应;同时依托消息持久化、重试、死信等机制,保证跨服务的数据在允许的时间窗口内达成最终一致,替代代价高昂的强一致性分布式事务。

示例:下单与库存扣减

  • 传统强一致方式:通过分布式事务协调订单与库存服务,全程锁定资源并等待所有节点确认,任一节点失败即整体回滚,系统吞吐量严重受限。

  • MQ 事件驱动方式:订单服务创建订单后,立即发送“订单已创建”事件至 MQ 并返回成功;库存、积分、物流等服务异步消费该事件,各自完成库存扣减、积分增加等操作。

  • 若某个消费失败,消息会按策略自动重试;达到重试上限后转入死信队列,由人工介入补偿,确保数据最终对齐。

价值

  • 核心流程不被下游异常阻断,整体可用性大幅增强。

  • 避免了长时间资源锁定和同步等待,吞吐量得到数量级提升。

  • 新增风控、数据分析等下游业务时,只需订阅相应事件,上游无感,架构天然具备高可扩展性。

四、核心概念与工作原理

1. 生产者-消费者模型

消息队列的核心思想源于生产者-消费者模型,它定义了消息传递中的三个基本角色:

  • 生产者(Producer):负责创建消息并将其发送到消息队列的应用程序。生产者不关心谁会消费消息,只负责投递

  • 消费者(Consumer):从消息队列中获取消息并进行业务处理的应用程序。消费者不关心消息来自谁,只负责处理

  • 消息队列(Queue/Topic):充当消息中转的容器。生产者将消息放入其中,消费者从中取出,二者在时间、空间上完全解耦

简单说:生产者只管发,消费者只管收,中间的队列负责暂存与传递。

2. 深入理解:Broker 内部的三大核心组件

上面的“消息队列”在逻辑上是一个整体概念,但在实际的 MQ 产品(如 RabbitMQ、Kafka)内部,它由三个更具体的组件协作完成消息的存储与分发:

① Broker(消息服务器)

  • 定位:MQ 的服务端实例,是整个系统的运行核心

  • 职责:接收生产者投递的消息,负责持久化存储、路由分发、消费组管理、ACK 处理等。生产环境中通常以集群形式部署,保证高可用与横向扩展能力

② Topic(主题)

  • 定位:消息的逻辑分类标签,用于消息的路由与归类

  • 职责:生产者将消息发送到指定 Topic,消费者通过订阅 Topic 来接收对应类别的消息。一个 Topic 可以被多个消费者组同时订阅,是实现发布/订阅模式的基础

③ Queue(队列)

  • 定位:消息的物理存储容器,消息在 Broker 中的最终存放位置

  • 职责:每个 Queue 是严格的 FIFO(先进先出) 队列,保证了单队列内的消息顺序性。在负载均衡模式下,同一个消费者组内,一个 Queue 只会分配给一个消费者,从而保证单条消息只被处理一次。不同消费者组之间则互不影响,各自拥有独立的消费进度

三者关系总结

  • Broker 是“邮局”,Topic 是“邮件类别”,Queue 是“传送带”

  • 消息流向:Producer → Broker → 按 Topic 分类 → 存入对应 Queue → 消费者从 Queue 中按序取出处理

3. 完整工作流程

  1. 生产者连接到 Broker

  2. 生产者将消息发送到指定的 Topic

  3. Broker 将消息存储到对应的 Queue 中

  4. 消费者连接到 Broker,订阅感兴趣的 Topic

  5. Broker 将消息推送给消费者,或者消费者主动拉取消息

  6. 消费者处理消息

  7. 消费者向 Broker 发送确认(ACK),表示消息已处理完成

  8. Broker 收到 ACK 后,将消息从 Queue 中删除

简化流程
业务触发 → 生产者封装消息 → 投递至 Broker → Broker 持久化存储 → 消费者监听并拉取/接收消息 → 业务处理 → 提交 ACK → Broker 清除或标记已消费


五、核心工作模型

1. 点对点模型(Point-to-Point,P2P)

  • 消息发送到一个Queue中

  • 一个Queue只能有一个消费者

  • 消息只能被消费一次

  • 消费者消费完消息后,消息被删除

适用场景:任务调度、订单处理等需要确保消息被唯一处理的场景

2. 发布-订阅模型(Publish-Subscribe,Pub/Sub)

  • 消息发送到一个Topic中

  • 一个Topic可以有多个消费者组

  • 每个消费者组可以有多个消费者

  • 同一个消费者组中的消费者共同消费Topic中的消息,一条消息只能被组内的一个消费者消费

  • 不同消费者组之间互不影响,一条消息可以被多个消费者组消费

适用场景:事件通知、日志收集、数据同步等需要多个消费者同时处理同一条消息的场景

Queue和Topic的区别

特性 Queue(队列) Topic(主题)
消息投递 一对一 一对多
消费者数量 一个 多个(消费者组)
消息消费 只能被消费一次 可以被多个消费者组消费
消息顺序 严格保证FIFO 分区内保证顺序,全局不保证
适用场景 任务调度、订单处理 事件通知、日志收集

六、核心技术内幕与可靠性保障

1. 消息确认机制(ACK)

消息队列通过消息确认机制(ACK)确保消息被正确处理,分为三个阶段:

① 生产者确认:确保消息成功到达 Broker

  • 同步确认:发送消息后阻塞等待 Broker 的确认响应,可靠性最高

  • 异步确认:发送后不等待,通过回调函数处理结果,性能更好

  • 事务消息:将本地事务和消息发送绑定,确保两者原子性(RocketMQ 支持)

② Broker 存储确认:确保消息成功持久化

  • 同步刷盘:消息写入磁盘后才返回确认,可靠性最高

  • 异步刷盘:消息写入内存后即返回确认,后台异步刷盘,性能更好

  • 多副本复制:消息被复制到多个 Broker 节点后才返回确认(如 Kafka 的 acks=all

③ 消费者确认:确保消息被成功处理

  • 自动确认:消费者收到消息即自动确认,性能最好但可靠性最低

  • 手动确认:消费者处理完业务逻辑后手动提交 ACK,可靠性最高

  • 批量确认:处理完一批消息后统一确认,兼顾性能与可靠性

最佳实践

  • 核心业务必须使用手动确认,确保消息处理成功后再提交 ACK

  • 生产者使用带确认的发送方式,并处理发送失败的情况

  • Broker 开启多副本复制,提高消息存储的可靠性

2. 消息顺序性

消息队列只能保证分区内的消息顺序,无法保证全局顺序。

① 局部顺序性(分区顺序)—— 业界主流方案

  • 生产端:将需要保证顺序的消息,通过业务分区键(如订单 ID、用户 ID)哈希路由到同一个 Queue

  • 消费端:同一个 Queue 只能被一个消费者线程串行消费

  • 优点:兼顾顺序性和吞吐量;缺点:只能保证局部顺序

② 全局顺序性 —— 牺牲性能换顺序

  • 生产端:所有消息都发送到同一个 Queue

  • 消费端:只能有一个消费者线程串行消费

  • 优点:严格全局有序;缺点:吞吐量极低,无法水平扩展

最佳实践

  • 绝大多数业务场景只需要局部顺序性,不需要全局顺序性

  • 选择合适的分区键,确保消息均匀分布到各个 Queue

  • 消费失败时原地重试,不要将消息发回重试队列,避免破坏顺序

3. 重复消费与幂等性

重复消费的根本原因:消息队列的“至少一次(At Least Once)”投递语义。为避免消息丢失,当消费者处理完消息但未及时提交 ACK 时(如网络抖动、消费者宕机),Broker 会重新投递消息。

幂等性:无论执行多少次操作,结果都与执行一次相同。解决重复消费问题的核心是保证消费逻辑的幂等性

三大幂等性实现方案

方案 核心原理 优点 缺点 适用场景
数据库唯一索引 利用唯一键约束,同一幂等键只能写入一次 实现简单、可靠性极强、天然原子性 高并发下数据库压力大 核心交易、支付、订单
Redis 原子去重 利用 SETNX 命令原子占坑,判断是否首次消费 性能极高、响应快 Redis 宕机可能丢数据 高并发、非核心业务
乐观锁(版本号) 更新时检查 version 字段,版本不匹配则放弃 适合更新操作、无锁竞争 只适合更新,不适合插入 库存扣减、余额扣款

最佳实践:核心业务优先使用数据库唯一索引,高并发场景可配合 Redis 原子去重作为前置过滤。

4. 死信队列(DLQ)

死信队列是专门存放无法被正常消费的消息的特殊队列。消息成为“死信”的原因:

  • 消息被消费者拒绝(Reject/Nack)且不再重试

  • 消息超过存活时间(TTL)

  • 消息长度超过队列限制

  • 消息重试次数达到上限

工作原理

  1. 为普通队列配置死信交换机(DLX)和死信路由键

  2. 当消息成为死信时,自动转发到死信交换机

  3. 死信交换机根据路由键将消息路由到死信队列

  4. 专门的消费者从死信队列中消费消息,进行人工处理或记录日志

核心价值

  • 避免消息丢失:无法处理的消息不会被直接删除,而是保存到死信队列

  • 隔离无效消息:防止单条异常消息阻塞整个消费链路

  • 支撑事后排查:通过分析死信队列中的消息,定位系统问题

  • 保障核心业务:核心业务不会因为个别异常消息而中断

5. 高并发原理

消息队列之所以能支持高并发,主要得益于以下核心技术:

① 顺序写盘
消息以追加(Append-Only)方式写入磁盘,形成顺序 I/O。顺序写磁盘的速度(约 600MB/s)接近内存读写,而随机写只有约 100KB/s,性能差距高达 6000 倍。Kafka、RocketMQ 等都采用日志结构存储。

② 零拷贝技术

  • 传统 I/O:磁盘 → 内核空间 → 用户空间 → 内核空间 → 网卡(4 次拷贝,4 次上下文切换)

  • 零拷贝:磁盘 → 内核空间 → 网卡(2 次拷贝,2 次上下文切换)

  • 通过 Linux 的 sendfile() 系统调用实现,数据直接从内核空间发送到网络,避免在用户态和内核态之间来回复制

③ 批量处理

  • 批量发送:生产者将多条消息暂存缓冲区,达到一定数量或时间后一次性发送

  • 批量消费:消费者一次性拉取多条消息,批量处理

  • 减少网络 I/O 次数和系统调用次数,大幅提升吞吐量

④ 分区并行处理

  • 将一个 Topic 划分为多个分区,每个分区可独立读写

  • 多个生产者可同时向不同分区发送消息

  • 多个消费者可同时消费不同分区的消息

  • 系统吞吐量可通过增加分区数线性扩展

七、主流消息队列选型对比

四大主流 MQ 核心特性

RabbitMQ

  • 开发语言:Erlang

  • 核心架构:交换器 + 队列模型,基于 AMQP 协议

  • 吞吐量:万级 QPS(单节点 1-2 万/秒)

  • 延迟:微秒级

  • 核心优势:功能丰富(多种交换机类型、死信队列、优先级队列)、可靠性高、社区活跃、易于上手

  • 核心劣势:吞吐量较低、集群扩展复杂、Erlang 语言二次开发难度大

  • 适用场景:业务系统、企业应用、对延迟敏感的场景

Kafka

  • 开发语言:Scala + Java

  • 核心架构:分区模型,分布式流处理平台

  • 吞吐量:百万级 QPS(单 Broker 50 万+/秒)

  • 延迟:毫秒级(约 10ms)

  • 核心优势:吞吐量极高、支持海量堆积、生态完善(与 Spark/Flink 无缝集成)、高可用

  • 核心劣势:功能相对单一(无内置延迟队列、死信队列)、运维复杂度高、消息延迟相对较高

  • 适用场景:大数据、日志收集、流处理、高吞吐场景

RocketMQ

  • 开发语言:Java

  • 核心架构:NameServer + Broker,分布式消息中间件

  • 吞吐量:十万级到百万级 QPS(单 Broker 10 万+/秒)

  • 延迟:毫秒级

  • 核心优势:阿里开源、金融级可靠性(经双11验证)、功能丰富(事务消息、延迟消息、死信队列、消息轨迹)、Java 技术栈易于二次开发

  • 核心劣势:国际影响力不如 Kafka、部分高级功能需商业版

  • 适用场景:金融、电商、核心业务系统、需要事务消息的场景

Redis Streams

  • 开发语言:C

  • 核心架构:基于 Redis 的流数据结构

  • 吞吐量:十万级 QPS

  • 延迟:微秒级

  • 核心优势:轻量级无需额外部署、延迟极低、支持持久化和消费者组

  • 核心劣势:不适合海量堆积(Redis 内存有限)、功能简单、可靠性不如专业 MQ

  • 适用场景:轻量级应用、实时通知、缓存更新

详细对比表

特性 RabbitMQ Kafka RocketMQ Redis Streams
开发语言 Erlang Scala+Java Java C
吞吐量 万级 百万级 十万~百万级 十万级
延迟 微秒级 毫秒级 毫秒级 微秒级
可靠性 极高
事务消息 不支持 不支持 支持 不支持
延迟消息 支持(插件) 不支持 支持 不支持
死信队列 支持 需自行实现 支持 不支持
运维复杂度
学习成本

选型建议

  • 大数据 / 日志 / 流处理:优先选 Kafka,生态最完善,吞吐量最高

  • 金融 / 电商核心业务:优先选 RocketMQ,可靠性最高,支持事务消息

  • 中小规模业务系统:优先选 RabbitMQ,功能丰富,易于上手

  • 轻量级应用 / 低延迟场景:可考虑 Redis Streams,无需额外部署

八、典型应用场景深度解析

1. 异步执行

将非核心、耗时的操作异步化,提升系统响应速度。

  • 用户注册后异步发送欢迎邮件和短信

  • 订单创建后异步推送通知

  • 数据备份、统计、日志收集等后台任务

2. 服务解耦

将强耦合的服务拆分为松耦合,提高系统的可维护性和可扩展性。

  • 订单系统与库存、支付、物流、积分系统解耦

  • 用户系统与各业务系统解耦

  • 新增功能时无需修改现有服务,服务故障不会相互影响

3. 流量削峰

应对突发高峰流量,避免系统被压垮。

  • 电商秒杀、大促活动

  • 节假日流量高峰

  • 突发事件导致的流量激增

4. 流式数据处理

实时处理海量数据流,与 Flink、Spark Streaming 等框架配合。

  • 实时日志分析、用户行为分析

  • 实时监控告警、实时推荐系统

5. 分布式事务最终一致性

在分布式系统中实现跨服务的数据一致性,主要有两种方案:

方案一:本地消息表

核心原理:利用本地数据库事务的原子性,保证业务操作和消息发送的一致性。

执行流程

  1. 在同一个本地数据库事务中,同时写入业务数据和待发送消息到本地消息表

  2. 定时任务轮询本地消息表中“待发送”状态的消息,发送到 MQ

  3. 发送成功后更新消息状态为“已发送”

  4. 消费方监听 MQ,收到消息后执行本地事务

  5. 执行成功后向生产方返回 ACK,生产方更新消息状态为“已完成”

优点:实现简单、不依赖特定 MQ、稳定性高

缺点:业务侵入性强、消息表与业务表同库可能影响性能、定时任务有延迟

方案二:事务消息(RocketMQ)

核心原理:通过“半消息”机制,将本地事务和消息发送绑定。

执行流程

  1. 生产者先向 Broker 发送一条“半消息”(暂存,消费者不可见)

  2. Broker 返回确认

  3. 生产者执行本地事务

  4. 根据本地事务结果,向 Broker 发送“提交”或“回滚”指令

  5. 若提交,半消息变为可投递状态,消费者可消费

  6. 若回滚,Broker 删除半消息

  7. 若生产者未发送确认指令(宕机等),Broker 定时回查生产者事务状态

优点:由中间件支持、一致性保障好、性能高、业务侵入性低

缺点:对 MQ 依赖强、只有 RocketMQ 等少数 MQ 支持

维度 本地消息表 RocketMQ 事务消息
事务保证 强一致(依赖DB事务) 最终一致(依赖回查)
实现复杂度 中等 简单(SDK封装)
MQ依赖
性能 中等(多一次DB写入)
适用场景 中小规模、简单业务 大规模、核心业务

6. 事件驱动架构(EDA)

以事件为核心的软件架构模式,系统各组件通过产生和消费事件进行通信协作。

核心组件

  • 事件(Event):描述系统中状态变化的不可变数据记录

  • 事件生产者:检测状态变化并发布事件

  • 事件消费者:订阅并处理事件

  • 事件通道:传输和存储事件的媒介(即消息队列)

核心优势

  • 松耦合:生产者和消费者之间完全解耦,只依赖事件格式

  • 高可扩展性:可随时添加新消费者,无需修改生产者

  • 高响应性:系统可实时响应事件,及时处理业务逻辑

典型应用:订单创建事件触发库存扣减、支付、物流、积分等一系列操作

九、生产落地核心挑战与解决方案

1. 消息丢失(全链路防护)

消息丢失可能发生在三个阶段:

阶段 丢失原因 解决方案
生产者 网络抖动、Broker宕机、异步发送未处理回调 确认机制 + 重试 + 事务消息/本地消息表
Broker 收到消息后未持久化就宕机 持久化 + 多副本 + 同步刷盘(核心业务)
消费者 自动确认后宕机、处理未完成就提交ACK 手动确认 + 异常全量捕获 + 业务幂等

全链路可靠性保障总结:生产端确认 + Broker 持久化多副本 + 消费端手动 ACK = 消息不丢失

2. 消息积压

本质原因:生产速度超过消费速度。

紧急处理(快速止血)

  1. 消费者紧急扩容:增加消费者实例(上限为 Queue/分区数)、调大消费线程池

  2. 异常消息隔离:将无法处理的消息快速转入死信队列,避免阻塞整体消费

  3. 暂停非核心生产者:优先保障核心业务

长期优化

  • 消费逻辑优化:异步化改造、批量写入、缓存预热

  • 架构优化:核心与非核心业务拆分独立 Topic、生产端限流

  • 监控预警:监控堆积量、消费延迟,设置合理告警阈值

3. 消息顺序性破坏

常见原因:消息路由到不同 Queue、多线程并发消费同一 Queue、重试导致乱序。

解决方案

  1. 生产端使用分区键(如订单 ID)将需保序消息路由到同一 Queue

  2. 消费端同一 Queue 只能被一个线程串行消费

  3. 消费失败时原地重试,不将消息发回重试队列

4. 系统复杂度增加

引入 MQ 后需额外考虑:部署运维监控、消息可靠性与幂等性、分布式事务处理、故障排查定位。

解决方案:建立完善监控运维体系、制定统一使用规范、加强团队培训。

十、生产环境最佳实践

消息设计

  • 消息体尽量小(<1KB),只传必要信息;大内容用对象存储,消息中仅传 ID/URL

  • 大消息开启压缩(推荐 LZ4 或 ZSTD 算法),但避免压缩过小的消息(<1KB)

  • 每条消息携带全局唯一 msgId,用于追踪和幂等;添加业务 Tag 和时间戳

Topic 与队列设计

  • 按业务域划分 Topic:不同业务使用不同 Topic,核心与非核心隔离

  • 分区数合理规划:消费者数量 ≤ 分区数 ≤ 消费者数量 × 1.5;避免分区过多导致元数据开销过大

  • 消费者组独立:不同业务系统使用不同消费者组,避免相互影响

监控告警

  • 核心监控指标:生产速率、堆积量、消费延迟、处理速率、错误率、磁盘使用率

  • 告警阈值参考:核心队列堆积 >1000、消费延迟 >5 分钟、磁盘使用率 >85%

重试与死信

  • 重试策略:指数退避(2s → 4s → 8s → 60s 封顶),最大重试 3-5 次

  • 死信队列:为每个业务队列配置对应的死信队列,定期监控和处理

核心总结

一句话理解 MQ:消息队列是分布式系统中的“交通枢纽”,通过异步、解耦、削峰三大核心能力,解决了分布式系统中的通信、性能和可靠性问题。

MQ 的本质:在分布式系统中引入一个中间层,将同步通信改为异步通信,将强耦合改为松耦合,从而提升系统的可扩展性、可靠性和性能。

使用 MQ 的核心原则

  • 不要为了用 MQ 而用 MQ,只有当同步架构确实无法满足需求时才引入

  • 引入 MQ 后,必须解决消息可靠性、顺序性、幂等性三大核心问题

  • 建立完善的监控和运维体系,确保 MQ 的稳定运行

  • 根据业务场景选择合适的 MQ 产品,不盲目追求新技术

posted @ 2026-05-30 20:50  kyle_7Qc  阅读(30)  评论(0)    收藏  举报