Skip to content

说一下消息队列的模型有哪些? ​

  • 标签:消息队列、后端

🏛 业务架构师 ​

消息模型基本就两大类,理解模型的业务含义比记产品重要:

  • 点对点(Queue / 队列模型):一条消息只被一个消费者处理,消费即删除。适合任务分发——发短信、生成账单,一份活一个人干;
  • 发布订阅(Topic / 主题模型):一条消息广播给所有订阅组,每组都拿到全量副本。适合事件广播——"订单已创建"事件同时喂给积分、风控、数仓,各干各的互不影响。

产品实现上有融合与差异:RabbitMQ 以队列为中心(通过 exchange 绑定实现路由与广播);Kafka 与 RocketMQ 本质是日志型发布订阅,一个 topic 多个 consumer group,组内分摊、组间广播。

业务建模时的关键映射:

  1. 业务事件用发布订阅:把"订单创建""支付成功"定义为事件主题,下游自主订阅,上游不认识下游——这是业务解耦的物理载体,新业务接入零侵入;
  2. 作业任务用点对点:扩容消费者就能水平分摊,天然负载均衡;
  3. 注意 Kafka 的分区语义:组内消费者数不能超过分区数,多出来的闲置——容量规划时分区数要提前按增长预留。

我的经验:先画业务事件流(谁产生事件、谁关心事件),再选模型和产品,让 MQ 拓扑跟着业务域走,而不是反过来让业务适配某个产品的概念。

🏗 系统架构师 ​

消息模型我按演进讲三类:

  • 队列模型(点对点):一条消息只有一个消费者消费,消费即删除。RabbitMQ 的基本队列,简单但无法多方订阅同一份数据;
  • 发布订阅模型:消息广播给所有订阅者,每方都收到全量。丢失了"竞争消费"的扩展能力;
  • 主题/分区模型(现代 MQ 的融合形态):topic 下分 partition/queue,分区之间并行、分区内有序、一个分区同一时刻只被组内一个消费者消费。Kafka、RocketMQ 都是这套。消费者组之间互不影响(每组都拿到全量),组内分摊消费(水平扩展)。

架构意义:分区模型同时拿到了"多方订阅 + 水平扩展 + 分区内顺序"三个能力,是 MQ 支撑高吞吐的根基。消费扩容的边界是分区数:消费者实例超过分区数就空转,所以规划时我会按目标吞吐倒推分区数(分区数 = 峰值吞吐 / 单分区吞吐,Kafka 单分区约几万 TPS),预留一倍余量,避免扩容消费者时无分区可分。

💻 全栈开发专家 ​

两种基本模型 + 一种演进:

  • 点对点(Queue/队列模型):一条消息只被一个消费者消费,消费即删除。任务分发场景(订单处理、短信发送)。
  • 发布订阅(Topic/主题模型):消息广播到所有订阅者,每个订阅者都能拿到全量消息。Kafka/RocketMQ 的 topic 就是这类。

Kafka/RocketMQ 的融合设计(重点):一个 topic 下多个 queue/partition,consumer group 内竞争(一条消息只给组内一个消费者),group 间广播(每组都拿全量)——一套语义同时覆盖两种模型:

text
topic: order-events (3 partitions)
  ├─ group A(订单服务,3 实例)→ 竞争消费
  └─ group B(风控服务,2 实例)→ 同样拿到全量

推 vs 拉:RabbitMQ 是 broker 推;Kafka 纯拉(消费者控制节奏,天然削峰);RocketMQ 的"push"本质是长轮询 pull,兼顾实时性和消费端自我保护。

选型经验:广播通知(配置变更、缓存失效)用 pub/sub + 不同 group;流量削峰用 queue 模型让 group 内多实例分摊。