📬 MQ 基础
为什么用 MQ · 三大价值 · 带来的问题 · 核心概念
1. 为什么使用消息队列?三大核心价值?
- 异步:请求不需要等待所有下游完成。例:下单 → 发短信/通知/积分,主流程只写库 + 发消息,秒级返回;下游并行消费
- 解耦:生产者不依赖消费者的实现和可用性。新增消费者只需订阅 topic,零改动生产端——系统演进不怕下游变化
- 削峰:突发流量(秒杀/大促)先入队,下游按自己速率消费,避免 DB 被瞬时洪峰打垮
异步化示例(下单)
// 同步阻塞版:下单要等 4 个系统全部完成(可能 800ms+)
orderService.create(); sms.send(); coupon.send(); points.add();
// MQ 异步版:只等订单库写成功 + 消息发成功(~100ms)
orderService.create(); // 主流程
mqProducer.send("order-created", order); // 发消息即返回
// sms/coupon/points 各自订阅消费,互不影响
🎯 面试要点
- 先答价值,再答代价(下面一题)——"用不用 MQ"的完整决策
- 三大价值对应三个场景:响应慢→异步、耦合高→解耦、流量峰→削峰
2. 使用 MQ 带来了哪些问题?(必问,答全)
- 系统可用性降低:MQ 挂了怎么办?→ 高可用集群(多副本)+ 降级开关(MQ 故障时走同步调用)
- 系统复杂度上升:消息丢失/重复/乱序/堆积四大问题(见可靠性页)+ 如何保证"发消息与业务写库原子性"(本地消息表/事务消息)
- 数据一致性问题:分布式事务(最终一致):消费者失败怎么补偿?→ 重试 + 死信 + 对账
🎯 面试要点
- 标准答案结构:"用 MQ 三个好处 + 三个新问题 + 每个问题的对策"
- 能主动说出"不是所有场景都该用 MQ"(低频调用直接同步)是加分项
3. MQ 的核心概念(通用)?
- Producer / Consumer:生产者(发消息)、消费者(收消息)
- Topic:消息主题(逻辑分类,如 order-created)
- Broker:MQ 服务节点(存储和转发消息)
- Queue / Partition:Topic 下的物理队列/分区——并行度与顺序性的基础
- Consumer Group:消费者组——组内竞争消费(一条消息一个消费者处理),组间广播(每个组都收到)
- ACK(确认):消费成功才确认,未确认的会重投——可靠性的基础机制
- Offset / 消费位点:记录消费到哪了,支持断点续传
🎯 面试要点
- "组内竞争、组间广播"是 MQ 消费模型的核心,讲清这一句就够
- Topic → Partition 的分层:并行度 = 分区数;分区内有序、跨分区无序(顺序问题根源)