1. 为什么使用消息队列?三大核心价值?

  1. 异步:请求不需要等待所有下游完成。例:下单 → 发短信/通知/积分,主流程只写库 + 发消息,秒级返回;下游并行消费
  2. 解耦:生产者不依赖消费者的实现和可用性。新增消费者只需订阅 topic,零改动生产端——系统演进不怕下游变化
  3. 削峰:突发流量(秒杀/大促)先入队,下游按自己速率消费,避免 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 带来了哪些问题?(必问,答全)

  1. 系统可用性降低:MQ 挂了怎么办?→ 高可用集群(多副本)+ 降级开关(MQ 故障时走同步调用)
  2. 系统复杂度上升:消息丢失/重复/乱序/堆积四大问题(见可靠性页)+ 如何保证"发消息与业务写库原子性"(本地消息表/事务消息)
  3. 数据一致性问题:分布式事务(最终一致):消费者失败怎么补偿?→ 重试 + 死信 + 对账

🎯 面试要点

  • 标准答案结构:"用 MQ 三个好处 + 三个新问题 + 每个问题的对策"
  • 能主动说出"不是所有场景都该用 MQ"(低频调用直接同步)是加分项

3. MQ 的核心概念(通用)?

🎯 面试要点

  • "组内竞争、组间广播"是 MQ 消费模型的核心,讲清这一句就够
  • Topic → Partition 的分层:并行度 = 分区数;分区内有序、跨分区无序(顺序问题根源)

🎤 常见面试追问

  1. 用 MQ 的三大好处和三大代价?(必背)——好处:异步(响应快)、解耦(互不影响)、削峰(扛洪峰);代价:可用性降低(MQ 挂了)、复杂度上升(丢失/重复/乱序/堆积)、一致性变复杂(要最终一致方案)。
  2. 什么时候不该用 MQ?——低频调用、强一致要求、团队没有运维能力——同步调用更简单可靠。"用不用 MQ"是权衡题。
  3. 消息队列和 RPC 的区别?——RPC:同步请求-响应(要结果,等对方);MQ:异步消息(发完就走,对方自己取)。MQ 适合解耦和削峰,RPC 适合实时调用。
  4. Topic 和 Queue 的关系?——Topic 是逻辑分类,下面有物理队列/分区;一个 topic 可以被多个消费组订阅(广播),组内竞争消费。

📖 名词解释(本页术语)

术语 大白话解释
消息队列(MQ)暂存消息的中间件:生产者放进去,消费者按自己节奏取——两边互不等、互不依赖。
异步 / 解耦 / 削峰MQ 三大价值:请求不等下游(快);上下游互不影响(松);洪峰先进队列(稳)。
Producer / Consumer生产者(发消息)和消费者(收消息处理)。
Topic消息的分类主题(order-created),消费者订阅它。
Consumer Group(消费组)组内竞争消费(一条消息只被一个组员处理)、组间广播(每个组都收到)。
ACK / OffsetACK 是"处理完确认"(不确认就重投);Offset 是消费位点(书签,重启接着读)。
BrokerMQ 服务器节点(存储和转发消息)。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。