1. 消息队列概述
1.1 核心概念
消息队列(Message Queue,MQ)是一种基于生产者-消费者模型的异步通信中间件。它通过一个先进先出(FIFO)的缓冲区,将消息的发送方(生产者)与接收方(消费者)解耦,使双方无需直接交互即可完成数据交换。
核心术语:
- 生产者(Producer):发送消息的应用程序或服务。
- 消费者(Consumer):接收并处理消息的应用程序或服务。
- 队列(Queue):消息的临时存储容器,保证消息有序到达。
- 主题(Topic):消息的逻辑分类,支持发布/订阅模式。
- 消息(Message):传输的数据单元,通常包含业务负载和元数据。
- 确认机制(ACK):消费者处理完成后向队列发送的确认信号,确保消息不丢失。
1.2 三大核心应用场景
| 场景 | 问题描述 | MQ 解决方案 | 典型收益 |
|---|---|---|---|
| 解耦 | 服务间直接调用,一方变更导致连锁修改 | 生产者只向队列发送消息,消费者独立订阅处理 | 服务独立演进,减少依赖 |
| 异步 | 同步调用导致请求响应时间过长 | 生产者发送后立即返回,消费者后台处理 | 降低延迟,提升吞吐量 |
| 削峰 | 突发流量压垮后端服务 | 消息暂存队列,消费者按能力拉取处理 | 保护系统,平滑流量 |
实战案例: 电商订单系统中,用户下单后,MQ 将订单消息分发给库存、支付、物流等子系统。即使物流服务暂时不可用,订单也能正常创建,消息在队列中等待恢复后继续处理。
1.3 主流消息队列对比
当前业界最常用的消息队列产品包括 RabbitMQ、Kafka 和 RocketMQ。三者在设计理念、性能特征和适用场景上存在显著差异。
| 特性 | RabbitMQ | Kafka | RocketMQ |
|---|---|---|---|
| 开发语言 | Erlang | Scala/Java | Java |
| 协议支持 | AMQP 0-9-1, MQTT, STOMP | 自定义 TCP 协议 | 自定义 TCP 协议 |
| 消息模型 | 队列 + 交换机(Exchange) | 主题分区(Topic + Partition) | 主题队列(Topic + Queue) |
| 吞吐量 | 万级/秒 | 百万级/秒 | 十万级/秒 |
| 消息可靠性 | 高(支持确认、持久化、镜像队列) | 高(副本机制、ISR) | 高(同步刷盘、同步复制) |
| 顺序消息 | 单队列有序 | 分区内有序 | 队列内有序 |
| 延迟消息 | 支持(插件) | 不支持原生 | 支持(18个等级) |
| 运维复杂度 | 中等 | 较高 | 中等 |
| 典型场景 | 微服务解耦、任务队列 | 日志收集、流处理、大数据 | 交易消息、金融场景 |
选型避坑:
- 不要用 RabbitMQ 处理海量日志流(吞吐瓶颈明显)。
- 不要用 Kafka 做金融级交易消息(原生不支持延迟消息,顺序消息需额外设计)。
- 不要用 RocketMQ 做 IoT 设备消息(协议较重,建议 MQTT)。