消息队列基础概念

返回

什么是消息队列?

消息队列(Message Queue) 就是一个中间件缓冲区 + 转发器:把发送消息/任务的生产者和处理消息/任务的消费者隔开。

┌─────────────┐      ┌─────────────┐      ┌─────────────┐
│  Producer   │ ──→  │     MQ      │ ──→  │  Consumer   │
│  (生产者)   │      │  (消息队列)  │      │  (消费者)   │
└─────────────┘      └─────────────┘      └─────────────┘

生产者只需要把消息发送到队列,不需要关心谁来处理;消费者只需要从队列中取消息,不需要关心是谁发的。

消息队列有哪些功能?

1. 解耦

场景示例: 电商下单流程

不使用消息队列时:

下单服务 → 库存服务
        → 短信服务
        → 积分服务
        → 推荐服务
  • 下单服务需要知道所有下游服务的存在
  • 任何一个下游服务挂了,可能影响下单
  • 新增一个服务(如邮件通知)需要修改下单服务代码

使用消息队列后:

下单服务 → [订单已创建消息] → MQ

                    库存服务、短信服务、积分服务、推荐服务...(自行订阅消费)
  • 下单服务只需要发一条”订单已创建”的消息
  • 其他服务谁需要谁来消费
  • 服务之间更独立,新增/删除消费者不需要修改生产者

2. 削峰

场景示例: 秒杀活动

流量突然暴涨时,系统处理不过来:

  • 直接同步调用:容易把下游服务打爆,导致雪崩
  • 用队列:先把请求排队,消费者按照自己的处理能力慢慢处理
用户请求 ──→ [MQ 缓冲区] ──→ 后端服务
         (10 万请求/秒)      (1 万请求/秒)

队列起到流量整形的作用,保护后端系统。

3. 异步

场景示例: 用户注册流程

同步处理:

注册 → 写入数据库 → 发送欢迎邮件 → 发送短信 → 初始化推荐数据 → 返回成功
     (50ms)       (2000ms)      (1000ms)     (500ms)        总耗时:4 秒+

异步处理:

注册 → 写入数据库 → 发送消息到 MQ → 返回成功
     (50ms)       (10ms)         总耗时:100ms 内

[MQ] → 邮件服务 → 短信服务 → 推荐服务(后台慢慢处理)

用户下单/注册以后立刻返回”成功”,其他非核心操作放到队列里慢慢做,提升用户体验

4. 可靠性

消息队列通常提供以下可靠性保障:

  • 持久化:消息写入磁盘,即使 MQ 重启也不会丢失
  • 确认机制(ACK):消费者处理完成后发送确认,MQ 才删除消息
  • 重试机制:消费失败的消息可以自动重试
  • 死信队列:多次重试失败的消息转移到死信队列,便于排查

5. 分布式事务

在微服务架构中,消息队列可以实现最终一致性的分布式事务:

1. 订单服务:创建订单 → 发送"订单已创建"消息
2. 库存服务:消费消息 → 扣减库存 → 发送"库存已扣减"消息
3. 支付服务:消费消息 → 扣款 → 发送"支付成功"消息
...

如果某个步骤失败,可以通过消息回滚补偿机制来保证数据一致性。

6. 顺序

某些场景下需要保证消息的处理顺序:

  • 订单状态变更:创建 → 支付 → 发货 → 签收(不能乱序)
  • 账户流水:存款 → 取款 → 存款(顺序不能颠倒)

消息队列可以支持分区有序全局有序的消息投递。

7. 数据流

消息队列可以作为数据管道,连接不同的数据处理系统:

日志收集 → Kafka → Flink 实时计算 → 数据仓库
用户行为 → Kafka → 推荐系统 → 个性化推送

在大数据和流式处理场景中,消息队列是数据流转的核心枢纽

常见消息队列产品对比

产品特点适用场景
RabbitMQ传统消息队列,路由灵活,延迟低企业级应用、复杂路由规则
Kafka吞吐超强,持久化好,支持分区日志收集、流式处理、事件总线
RocketMQ国内用得多,电商场景常见,支持事务消息电商订单、金融交易
Redis Streams轻量方案,基于内存,部署简单简单异步任务、小规模场景

选型建议

  • 追求高性能、大数据量 → Kafka
  • 企业级应用、复杂路由 → RabbitMQ
  • 电商、金融、需要事务消息 → RocketMQ
  • 快速上手、轻量级需求 → Redis Streams

📚 下一篇: 深入讲解各消息队列产品的详细使用方法和最佳实践。