消息队列

消息队列是微服务异步解耦、削峰填谷、事件驱动的核心基础设施。

解决的问题

没有 MQ:
  订单服务 → 同步调用 → 库存服务
                      → 邮件服务
                      → 积分服务
  任何一个失败或慢都影响下单响应

有 MQ:
  订单服务 → 发消息 → MQ → 库存服务(异步消费)
                          → 邮件服务(异步消费)
                          → 积分服务(异步消费)
  下单只需确保消息入队,其余异步处理

三大核心价值:

  • 异步解耦:生产者不依赖消费者的处理结果
  • 削峰填谷:流量洪峰时消息积压在 MQ,消费者按能力消费
  • 广播/扇出:一条消息被多个服务消费

核心概念

Producer(生产者)
   │ 发布
   ▼
Topic / Queue(消息存储)
   │ 订阅
   ▼
Consumer Group(消费者组)
   ├── Consumer A(消费 Partition 0)
   └── Consumer B(消费 Partition 1)
概念说明
Topic消息的逻辑分类,一个 Topic 对应一类消息
PartitionTopic 的物理分片,提高并行度
Consumer Group同一组内的消费者分摊消费,不同组独立消费
Offset消费位置标记,支持重放

Kafka 架构

Kafka 是大数据 / 云原生场景的首选 MQ。

Producer
   │
   ▼
┌──────────────────────────────────────┐
│         Kafka Broker Cluster         │
│                                      │
│  Broker 1   Broker 2   Broker 3     │
│  [P0 Leader] [P1 Leader] [P2 Leader] │
│  [P1 Replica][P2 Replica][P0 Replica]│
│                                      │
└──────────────────────────────────────┘
   │                    ZooKeeper / KRaft
   ▼                    (元数据管理)
Consumer Group
   ├── Consumer 0 → Partition 0
   ├── Consumer 1 → Partition 1
   └── Consumer 2 → Partition 2

Kafka 为什么快

设计说明
顺序写磁盘顺序 I/O 性能接近内存,远超随机写
Page Cache利用操作系统页缓存,避免用户态内存拷贝
Zero Copysendfile() 系统调用,磁盘直接到网卡,减少拷贝次数
批量发送Producer 批量打包,减少网络请求次数
分区并行多 Partition 并行读写
Pull 模型消费者主动拉取,自控速率

Kafka 可靠性保证

Producer
  acks=0  → 不等确认(最快,可能丢)
  acks=1  → 等 Leader 确认(默认)
  acks=-1 → 等所有 ISR 副本确认(最可靠)

消费语义:

语义说明实现
At Most Once最多一次,可能丢先提交 Offset 再处理
At Least Once至少一次,可能重复先处理再提交 Offset
Exactly Once恰好一次幂等 + 事务

主流 MQ 对比

MQ吞吐量延迟特点适用场景
Kafka极高(百万/s)毫秒级持久化、可回放、分区日志、事件流、大数据
Pulsar极高毫秒级云原生、多租户、存算分离云原生替代 Kafka
RocketMQ毫秒级事务消息、延迟消息、顺序消息电商、金融
RabbitMQ中(万~十万/s)微秒级协议丰富(AMQP)、路由灵活传统业务、低延迟

典型使用场景

订单系统

用户下单
   │
   ▼
订单服务 → 写 DB → 发消息到 MQ(order.created)
                         │
              ┌──────────┼──────────┐
              ▼          ▼          ▼
           库存服务   邮件服务   积分服务
          (扣减库存) (发邮件)  (加积分)

CDC(变更数据捕获)

MySQL Binlog
   │
Canal / Debezium
   │
   ▼
Kafka
   │
   ├── 同步 Elasticsearch(搜索索引)
   ├── 同步 Redis(缓存更新)
   └── 同步数据仓库

延迟消息

下单 → 发延迟消息(30分钟后触发)
                │
           30分钟后
                │
           检查是否支付
           未支付 → 取消订单

消息可靠传递

保证消息不丢失的三个环节:

Producer              MQ Broker             Consumer
  │                       │                     │
  │ 1. 发送确认机制         │                     │
  │ acks=-1, 重试3次       │                     │
  │──────────────────────►│                     │
  │                       │ 2. 持久化 + 副本     │
  │                       │ 主从同步,多副本     │
  │                       │──────────────────►  │
  │                       │                     │ 3. 手动 ACK
  │                       │                     │ 处理完再提交 Offset
  │                       │◄────────────────────│

Java 实战(Spring Cloud)