什么是消息队列?

消息队列(Message Queue)是一种用于系统之间异步通信的中间件,通过“生产者-消费者”模式解耦系统,提高并发处理能力和系统可靠性。

简单来说,消息队列理解为一个使用队列来通信的组件。它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。由于队列^1是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。

什么是消息队列|600

常用的消息中间件有 RabbitMQ Kafka RocketMQ

为什么需要消息队列?

消息队列主要就是为我们的系统带来了三点好处:

  • 异步
  • 解耦
  • 削峰

除了这三点之外,消息队列还有其他的一些应用场景,例如实现分布式事务、顺序保证和数据流处理。

异步

第一点,我认为消息队列最核心的能力是 异步处理

以经典的电商秒杀场景为例,如果没有使用消息队列,当用户点击下单后,系统需要同步完成创建订单、扣减库存、记录支付信息等一系列操作。
在高并发场景下,这种串行处理方式会导致接口响应时间变长,甚至因为数据库压力过大而出现超时或宕机问题。

引入消息队列之后,系统可以在完成核心校验后,先快速生成订单并将后续处理逻辑封装成消息发送到队列中,由消费者异步执行库存扣减、日志记录等操作。

这样做有两个好处:

  • 用户请求可以快速返回,提高响应速度;
  • 系统压力被分散处理,避免瞬时流量压垮数据库。

削峰

在上面瞬时高并发的场景下,避免系统宕机的手段就是 削峰填谷

削峰填谷|600

在秒杀等高并发场景下,流量往往是瞬时爆发的。例如在某一秒内可能有 1 万个下单请求,而数据库的实际处理能力可能只有每秒几千次 次。

如果没有消息队列,所有请求会直接打到数据库,可能导致:

  • 连接数耗尽
  • CPU 飙升
  • 服务雪崩

而引入消息队列后,可以将瞬时的高并发请求先写入队列中,由消费者按照自身处理能力逐步消费。

本质上就是:

用“队列”作为缓冲区,将流量洪峰变成平稳流量。

这样即使瞬间流量很高,系统也不会被直接压垮,而是以稳定速率逐步处理。

解耦

消息队列带来的另一个核心价值就是 解耦

如果系统之间直接调用,例如:

订单系统 → 调用库存系统 → 调用积分系统 → 调用通知系统

这种强依赖模式存在两个问题:

  1. 下游系统异常会影响上游系统
  2. 业务扩展困难,新增功能需要修改原有代码

引入消息队列后,订单系统只需要发送一条“订单创建成功”的消息:

  • 库存系统监听处理
  • 积分系统监听处理
  • 通知系统监听处理

订单系统无需关心具体有多少个消费者,也无需关心它们如何处理。

这种模式带来的好处:

  • 系统之间低耦合
  • 扩展新功能只需新增消费者
  • 某个下游系统故障不会直接影响主流程

总结

总体来说,消息队列的核心价值在于通过异步化提升响应速度,通过削峰填谷保护系统资源,通过解耦提高系统扩展性和稳定性。

当然,引入消息队列也会带来复杂性,例如消息丢失、重复消费等问题,需要通过确认机制和幂等设计来解决。

消息队列有什么缺点?

有句老话叫做“没有银弹^2”,消息队列也会有它的缺点:

  • 系统复杂性提高:引入 MQ 后,需要额外处理消息确认、重试机制、重复消费、死信队列等问题,整体架构比同步调用更复杂。
  • 系统可用性降低:MQ 本身成为新的依赖组件,一旦消息队列宕机或网络异常,可能影响整个业务流程。
  • 数据不一致问题:由于消息是异步处理,可能出现“消息发送成功但消费失败”或“本地事务成功但消息发送失败”的情况,系统通常只能保证最终一致性。

消息重复消费怎么解决?