一句话先记住
使用消息队列,核心是为了实现异步、解耦和削峰。
1. 为什么要用消息队列
1)异步
原来一个请求里要同步做很多事,会很慢。
比如用户注册后还要:
-
发短信
-
发邮件
-
送积分
如果都同步做,用户就要一直等。
用了 MQ 后,可以先把"注册成功"这个消息发出去,主流程先返回,后面的短信、邮件、积分异步处理。
所以它能:
提升接口响应速度。
2)解耦
如果一个系统直接调用多个下游系统,耦合会很重。
比如文章发布后要:
-
更新 ES
-
清缓存
-
发送通知
如果都写在主流程里,后面新增一个"推荐系统更新",就得改原来的代码。
用了 MQ 后,主业务只负责发消息,谁需要这个消息谁自己订阅。
所以它能:
让系统之间低耦合,方便扩展。
3)削峰填谷
高并发场景下,请求瞬间打到数据库或下游服务,容易把系统冲垮。
比如秒杀、抢券、下单高峰。
这时可以先把请求放进 MQ,后端慢慢消费。
所以 MQ 相当于一个缓冲区:
把瞬时高流量变成后端可承受的平稳流量。
2. 常见使用场景
场景 1:异步通知
比如:
-
用户注册后发短信
-
下单成功后发邮件
-
支付成功后通知积分系统
特点是:
这些不是主链路核心步骤,适合异步。
场景 2:数据分发
比如文章发布后:
-
更新 ES 索引
-
清理缓存
-
发送站内通知
一个消息发出去,多个系统各自消费。
这就是典型的事件驱动 / 数据分发。
场景 3:流量削峰
比如:
-
秒杀下单
-
抢优惠券
-
大促订单处理
请求先写入 MQ,再由消费者慢慢处理,保护数据库和核心服务。
3.面试回答版
使用消息队列,核心原因主要有三个:异步、解耦 和削峰。异步方面,比如用户注册成功后发送短信、邮件、积分发放,这些非核心流程可以放到 MQ 里异步执行,提升主流程响应速度。解耦方面,比如文章发布后需要更新 ES、清缓存、发通知,主业务不需要直接依赖这些下游系统,只需要发送一条消息,各个消费者自己订阅处理,后续扩展也更方便。削峰方面,在秒杀、抢券、大促下单这些高并发场景下,可以先把请求写入 MQ,作为缓冲区,再由后端服务按能力消费,防止数据库和下游系统被瞬时流量压垮。所以消息队列本质上就是通过异步消息通信提升系统性能、可扩展性和稳定性。