消息队列
消息队列是微服务异步解耦、削峰填谷、事件驱动的核心基础设施。
解决的问题
没有 MQ:
订单服务 → 同步调用 → 库存服务
→ 邮件服务
→ 积分服务
任何一个失败或慢都影响下单响应
有 MQ:
订单服务 → 发消息 → MQ → 库存服务(异步消费)
→ 邮件服务(异步消费)
→ 积分服务(异步消费)
下单只需确保消息入队,其余异步处理
三大核心价值:
- 异步解耦:生产者不依赖消费者的处理结果
- 削峰填谷:流量洪峰时消息积压在 MQ,消费者按能力消费
- 广播/扇出:一条消息被多个服务消费
核心概念
Producer(生产者)
│ 发布
▼
Topic / Queue(消息存储)
│ 订阅
▼
Consumer Group(消费者组)
├── Consumer A(消费 Partition 0)
└── Consumer B(消费 Partition 1)
| 概念 | 说明 |
|---|---|
| Topic | 消息的逻辑分类,一个 Topic 对应一类消息 |
| Partition | Topic 的物理分片,提高并行度 |
| 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 Copy | sendfile() 系统调用,磁盘直接到网卡,减少拷贝次数 |
| 批量发送 | 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
│ │◄────────────────────│