消息队列在你的系统里起什么作用?怎么选型?

后端开发第 9 / 13 题答题框架
参考思路:三大作用(削峰/解耦/异步)→引入的成本(一致性/重复消费/顺序)→选型维度(吞吐/延迟/功能)。讲一个真实使用案例。

五个经典回答示范

回答一 · 校招应届版

消息队列三大作用:异步——非核心链路异步化降低响应时间;解耦——生产方不关心谁消费,新增消费方不用改上游;削峰——突发流量先进队列,消费端按能力平稳处理。选型上 Kafka 吞吐高适合日志流,RocketMQ 功能全适合业务,RabbitMQ 灵活适合中小规模。

回答二 · 1-3年经验版

我落地过订单事件的通知解耦:订单状态机发布事件,短信、积分、推荐各自订阅。引入后必须处理三件事:不丢——生产端确认加 broker 持久化加消费端手动 ack;不重——消费端幂等;顺序——同一订单路由到同一分区。踩的坑是消费者重启时重复消费,靠业务 ID 幂等表解决。

回答三 · 资深版

我会先讲引入成本再讲收益:延迟不可见、一致性从强变最终、链路更长排障更难。所以决策标准是业务能不能接受秒级延迟、消费端是否可幂等。架构上关注:积压治理——扩消费者、批量消费、跳过可重算数据;可靠投递语义的三个层级;以及事务消息和本地消息表在最终一致里的角色。

回答四 · 追问应对

追问『消息丢了怎么查』:分段确认——生产端确认记录、broker 存量对账、消费端 ack 位点,三段对齐定位丢失环节;『积压百万怎么处理』:先看消费能力,扩并行度,批量写,不可跳过的冷数据转储离线补;『为什么不用 MQ 做强一致』:MQ 是最终一致工具,跨库强一致要别的事务方案。

回答五 · 反面示范

『加个 MQ 系统就更稳定了,所有接口都往 MQ 里发就行,消费者慢慢处理,丢消息也无所谓,反正可以人工补。』——点评:把 MQ 当万能缓冲,丢消息无所谓的态度在交易类业务里是事故级认知;没提幂等、顺序、积压任何一个核心问题。

怎么练这道题
  1. 打开 模拟练习,选择「后端开发」方向,限时 3 分钟作答本题。
  2. 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
  3. 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。

这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。

开始限时演练