2. 消息队列基础回顾
在进入接口契约设计之前,有必要先统一消息队列的核心概念认知,并了解主流 MQ 产品的选型差异。本章将围绕“生产者-消费者-主题-分区”这一基础模型展开,并通过对比表格与架构图帮助建立直观理解。
2.1 核心概念
消息队列(Message Queue,MQ)本质上是一种异步通信中间件,用于解耦生产者和消费者之间的直接依赖。以下四个概念是所有 MQ 产品的基石:
| 概念 | 定义 | 类比 |
|---|---|---|
| 生产者(Producer) | 负责发送消息的应用程序或服务实例。 | 寄信人 |
| 消费者(Consumer) | 负责接收并处理消息的应用程序或服务实例。 | 收信人 |
| 主题(Topic) | 消息的逻辑分类或频道。生产者将消息发往主题,消费者从主题订阅消息。 | 信箱上的标签 |
| 分区(Partition) | 主题内部的物理分片,用于水平扩展和并行消费。每个分区内的消息是有序的。 | 信箱的多个隔层 |
关键理解: 分区是 MQ 实现高吞吐的核心手段。生产者将消息按分区策略写入不同分区,消费者组内的不同实例可以分别消费不同分区,从而实现并行处理。
2.2 消息队列基础架构
下图展示了生产者、主题、分区与消费者之间的基本交互关系:
2.3 常见 MQ 选型对比
目前业界主流的消息队列产品包括 Kafka、RabbitMQ 和 RocketMQ。三者在设计哲学、适用场景和性能特征上存在显著差异:
| 对比维度 | Kafka | RabbitMQ | RocketMQ |
|---|---|---|---|
| 开发语言 | Scala / Java | Erlang | Java |
| 消息模型 | 发布-订阅(Topic + Partition) | 交换机-队列(Exchange + Queue) | 发布-订阅(Topic + Queue) |
| 吞吐量 | 极高(百万级/秒) | 较高(万级/秒) | 高(十万级/秒) |
| 消息可靠性 | 高(ACK + 副本机制) | 高(ACK + 持久化) | 高(同步刷盘 + 副本) |
| 消息顺序性 | 分区内严格有序 | 单队列有序 | 分区内严格有序 |
| 延迟 | 毫秒级(批量写入) | 微秒级 | 毫秒级 |
| 典型场景 | 日志收集、大数据管道、流处理 | 微服务异步通信、任务队列 | 交易消息、金融场景、IoT |
选型建议:
- 如果追求极致吞吐且消息顺序性要求高(如日志、埋点),优先选择 Kafka。
- 如果注重灵活路由和低延迟(如微服务解耦、RPC 异步化),优先选择 RabbitMQ。
- 如果需要强一致性和事务消息(如订单、支付),优先选择 RocketMQ。
2.4 消息队列核心流程对比
下图从消息写入和消息消费两个维度,对比三种 MQ 的核心流程差异:
2.5 本章小结
- 生产者、消费者、主题、分区是消息队列的四大核心概念,理解它们之间的关系是后续设计接口契约的基础。
- Kafka 适合高吞吐、日志类场景;RabbitMQ 适合灵活路由、低延迟场景;RocketMQ 适合事务消息、强一致性场景。
- 选型时需综合考虑吞吐量、延迟、消息顺序性、可靠性以及运维成本等因素。