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 的完整链路。

MQ 核心组件协作关系 MQ 核心组件协作关系 Producer Topic Partition 0 Partition 1 Partition 2 Broker 1 Broker 2 Broker 3 Consumer Group Consumer 1 Consumer 2 Consumer 3 每个 Consumer 负责一个或多个 Partition,实现并行消费;Partition 内消息顺序保证,跨 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 两种消息模型对比图

下图从消息流向角度直观对比点对点与发布订阅的核心差异。

点对点 vs 发布订阅消息模型 点对点 vs 发布订阅消息模型 点对点(P2P) Producer Queue Consumer A Consumer B 消息只被一个 Consumer 消费(负载均衡) 发布订阅(Pub/Sub) Producer Topic Group 1 Group 2 每个 Consumer Group 独立消费全量消息

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)。