2. MQ 基础回顾:消息队列核心概念与消息模型
在深入诊断消息堆积与读写分离架构之前,必须先统一对消息队列基础概念的理解。本章将系统梳理 Producer、Consumer、Topic、Partition、Broker 五大核心组件,并对比两种经典消息模型:点对点与发布订阅。
2.1 五大核心组件
消息队列的物理部署与逻辑模型由以下组件构成,它们之间的协作关系决定了系统的吞吐、可靠性与扩展能力。
| 组件 | 角色定义 | 关键特征 |
|---|---|---|
| Producer | 消息的生产者,负责将业务数据封装为消息并发送到 Broker。 | 可同步/异步发送;支持批量、压缩、事务;需处理发送确认与重试。 |
| Consumer | 消息的消费者,从 Broker 拉取或接收消息进行业务处理。 | 维护消费位移(Offset);支持手动/自动提交;可水平扩展。 |
| Topic | 消息的逻辑分类,类似数据库中的表,用于区分不同业务类型。 | 一个 Topic 可被多个 Consumer Group 订阅;消息按 Topic 隔离。 |
| Partition | Topic 的物理分片,每个 Partition 是一个有序、不可变的消息日志。 | Partition 内消息有序;Partition 是并行消费与存储的最小单元。 |
| Broker | 消息队列的服务节点,负责存储、转发、管理元数据。 | 集群模式下多 Broker 分担负载;Leader/Follower 副本机制保证高可用。 |
核心认知: Topic 是逻辑容器,Partition 是物理存储单元。一个 Topic 通常包含多个 Partition,Partition 分布在不同的 Broker 上,从而实现负载均衡与水平扩展。
2.2 核心组件协作关系图
下图展示了 Producer 发送消息到 Topic,Topic 按 Partition 分布到多个 Broker,Consumer Group 中的多个 Consumer 各自消费不同 Partition 的完整链路。
2.3 消息模型:点对点(P2P)
点对点模型基于 Queue 实现,一条消息只能被一个消费者消费,消费后消息即被移除。适用于任务分发、异步解耦等场景。
- 发送端: Producer 将消息发送到指定 Queue。
- 消费端: 多个 Consumer 监听同一 Queue,消息采用负载均衡策略分配给其中一个 Consumer。
- 可靠性: 消息消费后需确认(ACK),未确认的消息会重新投递。
- 典型产品: RabbitMQ 的 Queue 模式、ActiveMQ 的 Queue 模式。
实战提示: 点对点模型天然适合“一个任务只被处理一次”的场景,例如订单超时取消、短信发送。如果业务需要广播通知所有节点,则应使用发布订阅模型。
2.4 消息模型:发布订阅(Pub/Sub)
发布订阅模型基于 Topic 实现,一条消息可以被多个订阅者(Consumer Group)消费,每个订阅者独立消费全量消息。适用于事件通知、数据同步、日志分发等场景。
| 对比维度 | 点对点(P2P) | 发布订阅(Pub/Sub) |
|---|---|---|
| 消息消费方式 | 一条消息只被一个消费者消费 | 一条消息可被多个订阅者消费 |
| 消息生命周期 | 消费后删除(或标记删除) | 所有订阅者消费完或过期后删除 |
| 存储模型 | Queue(队列) | Topic(主题) |
| 典型场景 | 任务分发、异步处理 | 事件广播、日志收集、数据同步 |
| Kafka 实现 | Consumer Group 内单消费者(等效) | 多个 Consumer Group 订阅同一 Topic |
2.5 两种消息模型对比图
下图从消息流向角度直观对比点对点与发布订阅的核心差异。
2.6 Kafka 中的消息模型映射
Kafka 虽然基于 Topic/Partition 架构,但通过 Consumer Group 机制同时支持两种消息模型:
- 点对点效果: 多个 Consumer 属于同一个 Group,Topic 的每个 Partition 只分配给 Group 内的一个 Consumer,消息在 Group 内被负载均衡消费。
- 发布订阅效果: 多个 Group 订阅同一个 Topic,每个 Group 独立消费全量消息,互不干扰。
常见误区: 初学者常认为 Kafka 只有发布订阅模型。实际上,通过控制 Consumer Group 的数量和配置,Kafka 可以灵活实现两种模型。在诊断消息堆积时,必须明确当前是 Group 内消费不均(点对点失衡)还是 Group 间消费延迟(发布订阅场景)。
2.7 本章小结
- Broker 是物理节点,Topic 是逻辑分类,Partition 是物理分片与并行单元。
- Producer 写入消息到指定 Topic 的 Partition,Consumer 从 Partition 拉取消息并维护 Offset。
- 点对点模型 基于 Queue,消息被一个消费者消费;发布订阅模型 基于 Topic,消息被多个订阅者消费。
- Kafka 通过 Consumer Group 机制统一两种模型:同 Group 内负载均衡(P2P),不同 Group 独立消费(Pub/Sub)。