软件技术 · 知识点深化 · 分布式系统
消息队列:解耦、异步、削峰与消息可靠性
MQ 是后端架构的万能扳手:解耦、异步、削峰三大用途。但用了 MQ 就会有新问题:消息重复、消息丢失、顺序性、积压。这一页把 MQ 的好处和坑一次讲透。
① 怎么学(4 步走,约 70 分钟)
先建立直觉再抠细节,按这四步走最稳:
1看图建立直觉(10 分钟)
读②③:先在脑子里画出本课核心结构图。
2记完整体系(15 分钟)
读④:把对比表和公式看懂,不要急着背。
3跟例题走一遍(20 分钟)
精读⑤:看三个例题怎么用知识点解题。
4刷题纠错(剩余时间)
做⑦⑩,错题回⑥诊断。
本课小目标学完你要能:① 说出 MQ 三大作用;② 保证消息不丢;③ 处理重复消费;④ 解决消息积压。
② 一图看懂:消息队列全景
读法:中心是本课主题,四条分支展开核心维度,下方是典型应用与高频易错点。
③ 本质直觉:MQ 就是"前台取号"
银行柜台人多,直接排队大家都站着累。取号机就是 MQ:你取个号(发消息),柜员慢慢处理(消费),你不用站在那等。
解耦:下单服务只发一条消息到 MQ,不关心是谁在消费(短信、积分、物流)。新增消费方不用改下单代码。
异步:下单不用等短信发完才返回,用户体验快了。
削峰:秒杀瞬间 1 万请求打到 MQ,后端按自己的节奏 1000/s 消费,不会被打垮。
代价:消息可能重复投递(网络重试)、可能丢(生产者/ Broker/消费者任一环节)、可能乱序。这些都要额外处理。
没有银弹MQ 引入了系统复杂度:要运维 MQ、处理重复、排查积压。简单业务别为了用 MQ 而用。
④ 完整知识体系
消息可靠性三环节
| 环节 | 风险 | 对策 |
| 生产者发送 | 消息没到 MQ | 确认机制/本地消息表 |
| Broker 存储 | MQ 宕机丢消息 | 持久化+主从同步 |
| 消费者处理 | 处理完没 ack | 手动 ack+幂等 |
消息不丢三保证生产者确认 + Broker 持久化 + 消费者手动 ack
幂等方案唯一消息 ID + 去重表/数据库唯一键
消息顺序性
同一业务 key(如订单 ID)的消息发到同一队列,单线程消费,保证顺序。不同 key 可以并行。
消息积压怎么办
1. 先扩容消费者(注意分区数限制);2. 临时批量转发到新 Topic;3. 排查为什么消费慢(DB 慢、下游接口慢)。
⑤ 应用场景与例题
例1 下单后发短信、加积分、发物流通知
怎么设计?
下单服务发一条 OrderCreated 消息到 MQ,三个消费者独立订阅。新增通知类型不用改下单服务。
例2 消息重复消费怎么办?
网络重试导致消费者收到两次。
消费端幂等:消息带唯一 ID,消费前查去重表,已处理过就跳过。数据库操作加唯一约束(如订单号唯一)。
例3 秒杀流量 1 万 QPS,后端只能处理 1000
怎么用 MQ?
请求都打到 MQ,后端按 1000/s 消费。超出的请求在 MQ 排队,前端提示"排队中"。削峰填谷。
做题心法MQ 解决解耦异步削峰,但带来可靠性和幂等问题,要配套处理。
⑥ 高频错误诊断(4 条)
错误1:以为 MQ 一定不丢消息三个环节任一环节没配好就会丢,必须全链路保障。
错误2:消费端不做幂等网络重试导致重复扣库存/重复发短信。
错误3:消息积压不告警消费慢了没人知道,最终用户看到数据延迟。
错误4:所有消息都要求顺序顺序消费降低并发,只对需要的 key 保证顺序。
⑦ 考点真题演练(5 题)
考点分布
| 考法 | 出题形式 | 应对 |
| 作用 | 问 MQ 三大用途 | 解耦异步削峰 |
| 可靠 | 问怎么不丢 | 三环节全保障 |
| 重复 | 问怎么处理 | 消费端幂等 |
| 积压 | 问怎么解决 | 扩容消费者+排查慢 |
真题basic1. 以下哪个不是 MQ 的作用?
真题mid2. 保证消息不丢失需要?
真题mid3. 消息重复消费怎么解决?
真题hard4. 消息大量积压首先应该?
真题hard5. 保证同一订单消息顺序消费,应该?
⑧ 必背知识点卡
三作用:解耦异步削峰
不丢:生产确认+Broker持久化+手动ack
不重:消费端幂等,唯一ID去重
顺序:同 key 同队列
积压:扩容消费者,排查慢原因
选型:RocketMQ 事务消息,Kafka 日志吞吐
代价:复杂度上升,简单业务别滥用
⑨ 动手输出:设计一个订单通知 MQ 方案
场景:下单后要通知短信、积分、物流三个系统。
① 选型:RocketMQ,下单服务发 OrderCreated 消息。
② 可靠:生产者发确认,Broker 持久化主从同步。
③ 消费:三个消费者独立订阅,手动 ack。
④ 幂等:消息带订单 ID,消费前查去重表。
⑤ 监控:积压量、消费失败率告警。
口述思路MQ 是加速器也是缓冲区,但可靠性三件套不能少。
⑩ 分层练习(基础 + 中档 + 拔高)
▍基础 6 题
基础2消息不丢要哪三环节?
生产确认、Broker持久化、手动ack。
基础4消息积压怎么办?
扩容消费者+排查慢原因。
基础6MQ 会不会引入复杂度?
会,要运维和排查。
▍中档 5 题
中档1为什么下单要异步发短信?
同步发短信会拉长下单响应时间,异步提升体验。
中档2手动 ack 和自动 ack 区别?
自动 ack 可能处理失败就丢;手动 ack 处理完才确认。
中档3本地消息表和 MQ 怎么配合?
业务同事务写表,后台投递 MQ。
中档4Kafka 适合什么场景?
日志、大数据吞吐,不适合业务消息。
中档5RocketMQ 事务消息解决什么?
本地事务和发消息原子性。
▍拔高 5 题
拔高1消息积压到 100 万怎么处理?
先扩容消费者,再排查慢消费,必要时转新 Topic 临时消费。
拔高2 exactly-once 能做到吗?
生产上很难,一般用 at-least-once + 幂等。
拔高3Broker 主从同步策略?
同步写主从才不丢,异步写主可能丢。
拔高4消费失败重试策略?
指数退避重试,死信队列兜底。
拔高5如何避免一个大消息拖垮队列?
大消息分块或传引用,不要传大对象。
⑪ 记忆口诀 + 7 天复习计划
三句口诀① 解耦异步又削峰,MQ 是个缓冲池。② 不丢三环节全要,不重消费端幂等。③ 积压扩容查慢因,同 key 才保顺序。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③,画 MQ 流程图 | 三作用说清 |
| 第 2 天 | 背可靠性表 + 基础 6 题 | 三环节记住 |
| 第 3 天 | 做中档 5 题,写幂等方案 | 唯一ID |
| 第 4 天 | 做拔高 5 题,设计积压处理 | 步骤对 |
| 第 5 天 | 做⑦真题 5 题 | 限时每题 2 分钟 |
| 第 6-7 天 | 合书口述消息不丢三保障 | 不看资料 |
← 返回软件技术总览