MQ 概述
一. 什么是消息队列:核心定位与本质
-
消息队列(Message Queue,简称 MQ)是分布式系统中实现异步通信的中间件。其本质是一个“带存储能力且遵循先进先出(FIFO)原则的智能中转站”,用于在生产者(Producer)与消费者(Consumer)之间可靠地传递消息。
-
可以把它想象成一个“智能信箱”:生产者将消息投入信箱即可离开,消费者按自己的节奏取出处理,双方既不需要同时在线,也不必知道对方的存在。基于生产者-消费者模型,MQ 将服务或进程间同步、紧耦合的 RPC(Remote Procedure Call,远程过程调用)转化为异步、松耦合的消息传递,从而成为微服务、高并发、事件驱动架构的核心基础设施。
核心特质:
-
异步通信:生产者发送消息后无需等待消费者处理完成,即可继续执行
-
解耦:生产者和消费者通过消息队列间接通信,互不依赖对方的实现和可用性
-
缓冲:可暂存消息,平滑应对突发流量,避免下游被瞬间冲垮
-
持久化:消息可保存到磁盘,即使系统崩溃也不会丢失
-
可靠性:提供消息确认机制(ACK),确保消息被正确处理
一句话理解:以异步、缓冲、解耦的设计,牺牲实时强一致性,换取系统的高可用、高吞吐与高可扩展性
二、为什么需要 MQ:传统同步架构的痛点
在没有消息队列的传统同步架构中,服务之间通过直接调用进行通信,存在以下严重问题:
-
强耦合:一个服务的修改会影响所有依赖它的服务
-
例如:订单服务需要调用库存、支付、物流、通知等多个服务
-
新增一个服务(如积分服务)时,必须修改订单服务的代码
-
任何一个下游服务故障,都会导致整个订单流程失败
-
-
性能瓶颈:同步调用会阻塞主线程,响应时间是所有服务调用时间的总和
-
例如:订单服务调用库存(100ms) + 支付(200ms) + 物流(150ms) + 通知(50ms) = 500ms
-
高并发下,大量线程被阻塞,系统吞吐量急剧下降
-
-
无法应对突发流量:系统的处理能力是固定的,当流量突然激增时,会直接被打垮
- 例如:电商秒杀活动,每秒上万个请求同时到达,数据库瞬间被压垮
三、 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. 完整工作流程
-
生产者连接到 Broker
-
生产者将消息发送到指定的 Topic
-
Broker 将消息存储到对应的 Queue 中
-
消费者连接到 Broker,订阅感兴趣的 Topic
-
Broker 将消息推送给消费者,或者消费者主动拉取消息
-
消费者处理消息
-
消费者向 Broker 发送确认(ACK),表示消息已处理完成
-
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)
-
消息长度超过队列限制
-
消息重试次数达到上限
工作原理:
-
为普通队列配置死信交换机(DLX)和死信路由键
-
当消息成为死信时,自动转发到死信交换机
-
死信交换机根据路由键将消息路由到死信队列
-
专门的消费者从死信队列中消费消息,进行人工处理或记录日志
核心价值:
-
避免消息丢失:无法处理的消息不会被直接删除,而是保存到死信队列
-
隔离无效消息:防止单条异常消息阻塞整个消费链路
-
支撑事后排查:通过分析死信队列中的消息,定位系统问题
-
保障核心业务:核心业务不会因为个别异常消息而中断
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. 分布式事务最终一致性
在分布式系统中实现跨服务的数据一致性,主要有两种方案:
方案一:本地消息表
核心原理:利用本地数据库事务的原子性,保证业务操作和消息发送的一致性。
执行流程:
-
在同一个本地数据库事务中,同时写入业务数据和待发送消息到本地消息表
-
定时任务轮询本地消息表中“待发送”状态的消息,发送到 MQ
-
发送成功后更新消息状态为“已发送”
-
消费方监听 MQ,收到消息后执行本地事务
-
执行成功后向生产方返回 ACK,生产方更新消息状态为“已完成”
优点:实现简单、不依赖特定 MQ、稳定性高
缺点:业务侵入性强、消息表与业务表同库可能影响性能、定时任务有延迟
方案二:事务消息(RocketMQ)
核心原理:通过“半消息”机制,将本地事务和消息发送绑定。
执行流程:
-
生产者先向 Broker 发送一条“半消息”(暂存,消费者不可见)
-
Broker 返回确认
-
生产者执行本地事务
-
根据本地事务结果,向 Broker 发送“提交”或“回滚”指令
-
若提交,半消息变为可投递状态,消费者可消费
-
若回滚,Broker 删除半消息
-
若生产者未发送确认指令(宕机等),Broker 定时回查生产者事务状态
优点:由中间件支持、一致性保障好、性能高、业务侵入性低
缺点:对 MQ 依赖强、只有 RocketMQ 等少数 MQ 支持
| 维度 | 本地消息表 | RocketMQ 事务消息 |
|---|---|---|
| 事务保证 | 强一致(依赖DB事务) | 最终一致(依赖回查) |
| 实现复杂度 | 中等 | 简单(SDK封装) |
| MQ依赖 | 低 | 高 |
| 性能 | 中等(多一次DB写入) | 高 |
| 适用场景 | 中小规模、简单业务 | 大规模、核心业务 |
6. 事件驱动架构(EDA)
以事件为核心的软件架构模式,系统各组件通过产生和消费事件进行通信协作。
核心组件:
-
事件(Event):描述系统中状态变化的不可变数据记录
-
事件生产者:检测状态变化并发布事件
-
事件消费者:订阅并处理事件
-
事件通道:传输和存储事件的媒介(即消息队列)
核心优势:
-
松耦合:生产者和消费者之间完全解耦,只依赖事件格式
-
高可扩展性:可随时添加新消费者,无需修改生产者
-
高响应性:系统可实时响应事件,及时处理业务逻辑
典型应用:订单创建事件触发库存扣减、支付、物流、积分等一系列操作
九、生产落地核心挑战与解决方案
1. 消息丢失(全链路防护)
消息丢失可能发生在三个阶段:
| 阶段 | 丢失原因 | 解决方案 |
|---|---|---|
| 生产者 | 网络抖动、Broker宕机、异步发送未处理回调 | 确认机制 + 重试 + 事务消息/本地消息表 |
| Broker | 收到消息后未持久化就宕机 | 持久化 + 多副本 + 同步刷盘(核心业务) |
| 消费者 | 自动确认后宕机、处理未完成就提交ACK | 手动确认 + 异常全量捕获 + 业务幂等 |
全链路可靠性保障总结:生产端确认 + Broker 持久化多副本 + 消费端手动 ACK = 消息不丢失
2. 消息积压
本质原因:生产速度超过消费速度。
紧急处理(快速止血):
-
消费者紧急扩容:增加消费者实例(上限为 Queue/分区数)、调大消费线程池
-
异常消息隔离:将无法处理的消息快速转入死信队列,避免阻塞整体消费
-
暂停非核心生产者:优先保障核心业务
长期优化:
-
消费逻辑优化:异步化改造、批量写入、缓存预热
-
架构优化:核心与非核心业务拆分独立 Topic、生产端限流
-
监控预警:监控堆积量、消费延迟,设置合理告警阈值
3. 消息顺序性破坏
常见原因:消息路由到不同 Queue、多线程并发消费同一 Queue、重试导致乱序。
解决方案:
-
生产端使用分区键(如订单 ID)将需保序消息路由到同一 Queue
-
消费端同一 Queue 只能被一个线程串行消费
-
消费失败时原地重试,不将消息发回重试队列
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 产品,不盲目追求新技术

浙公网安备 33010602011771号