← 返回软件技术总览 软件技术 · 知识点深化 · 消息队列:解耦、异步、削峰与消息可靠性
软件技术 · 知识点深化 · 分布式系统

消息队列:解耦、异步、削峰与消息可靠性

MQ 是后端架构的万能扳手:解耦、异步、削峰三大用途。但用了 MQ 就会有新问题:消息重复、消息丢失、顺序性、积压。这一页把 MQ 的好处和坑一次讲透。

① 怎么学(4 步走,约 70 分钟)

先建立直觉再抠细节,按这四步走最稳:

1看图建立直觉(10 分钟)
读②③:先在脑子里画出本课核心结构图。
2记完整体系(15 分钟)
读④:把对比表和公式看懂,不要急着背。
3跟例题走一遍(20 分钟)
精读⑤:看三个例题怎么用知识点解题。
4刷题纠错(剩余时间)
做⑦⑩,错题回⑥诊断。
本课小目标学完你要能:① 说出 MQ 三大作用;② 保证消息不丢;③ 处理重复消费;④ 解决消息积压。

② 一图看懂:消息队列全景

MQ 解耦 发消息不用关心谁消费 异步 主流程不等下游 削峰 流量洪峰缓冲 可靠 不丢不重有序 应用:订单发短信/日志 异步通知 易错:重复消费导致重复扣减 必须幂等
读法:中心是本课主题,四条分支展开核心维度,下方是典型应用与高频易错点。

③ 本质直觉:MQ 就是"前台取号"

银行柜台人多,直接排队大家都站着累。取号机就是 MQ:你取个号(发消息),柜员慢慢处理(消费),你不用站在那等。

解耦:下单服务只发一条消息到 MQ,不关心是谁在消费(短信、积分、物流)。新增消费方不用改下单代码。

异步:下单不用等短信发完才返回,用户体验快了。

削峰:秒杀瞬间 1 万请求打到 MQ,后端按自己的节奏 1000/s 消费,不会被打垮。

代价:消息可能重复投递(网络重试)、可能丢(生产者/ Broker/消费者任一环节)、可能乱序。这些都要额外处理。

生产者下单 MQ缓冲 短信 积分 物流
没有银弹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 题

基础1MQ 三大作用?
解耦、异步、削峰。
基础2消息不丢要哪三环节?
生产确认、Broker持久化、手动ack。
基础3重复消费怎么处理?
消费端幂等。
基础4消息积压怎么办?
扩容消费者+排查慢原因。
基础5怎么保证顺序?
同 key 同队列。
基础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 天合书口述消息不丢三保障不看资料

← 返回软件技术总览