2. 消息队列核心模型:深入理解点对点模型与发布订阅模型,在交易场景下的选择策略

消息队列的模型选择,说白了就是决定「谁」能拿到「什么」消息。我在交易系统里踩过不少坑,今天跟你聊聊两种核心模型——点对点和发布订阅。它们看起来简单,但选错了,系统可能直接崩掉。

2.1 点对点模型(P2P)

点对点模型,也叫队列模型。一个消息只能被一个消费者消费。消息进入队列后,多个消费者竞争,谁抢到算谁的。

核心特征:

  • 一条消息只被一个消费者处理
  • 消息一旦被消费,就从队列中移除
  • 消费者之间是竞争关系
  • 天然支持负载均衡

我在做订单处理系统时,就用点对点模型。订单消息进入队列,多个处理节点抢着处理。为什么?因为一个订单只能被处理一次,重复处理就出大问题了。

我的经验:点对点模型最适合「任务分发」场景。比如订单处理、风控校验、清算对账。每个任务只需要一个worker处理,多了反而乱。

2.2 发布订阅模型(Pub/Sub)

发布订阅模型就完全不一样了。一个消息可以被多个消费者同时消费。生产者发布消息到Topic,所有订阅了这个Topic的消费者都能收到。

核心特征:

  • 一条消息可以被多个消费者消费
  • 消费者之间是独立关系
  • 消息通常持久化在Topic中
  • 支持广播模式

我记得有一次做行情系统,行情数据需要同时推送给交易引擎、风控系统、监控平台。这时候用点对点模型就傻了——每个系统都得单独发一份。发布订阅模型正好解决这个问题,行情Topic一发,所有订阅者都能收到。

2.3 交易场景下的选择策略

你想想看,交易系统里什么场景用点对点,什么场景用发布订阅?我总结了一套选择策略,直接上表格。

场景 推荐模型 原因
订单处理 点对点 一个订单只需一个处理器
行情推送 发布订阅 多系统需要同时接收
风控校验 点对点 避免重复校验
交易日志 发布订阅 归档、分析、监控都需要
清算对账 点对点 任务隔离,互不干扰
系统通知 发布订阅 所有节点需要感知

避坑指南:我曾经在一个项目里,把行情推送用成了点对点模型。结果每个消费者都单独拉取行情,导致行情网关压力巨大,延迟飙升。后来改成发布订阅,问题直接解决。选错模型,代价很大。

2.4 混合使用策略

实际交易系统中,很少只用一种模型。我习惯把两种模型混着用。比如一个交易链路:

  • 订单进入时,用点对点模型分发到不同的处理节点
  • 订单状态变更时,用发布订阅模型通知所有相关系统
  • 成交结果产生时,点对点模型写入数据库,发布订阅模型推送给行情和风控

嗯,这里要注意。混合使用时,一定要做好消息的幂等处理。因为发布订阅模型下,同一个消息可能被多个消费者处理,如果处理逻辑有副作用,必须保证幂等。

2.5 核心逻辑框架图

下面这张图,我画了两种模型在交易系统中的典型应用。你看一眼就明白了。

交易系统消息队列模型选择 点对点模型(P2P) 订单生产者 订单队列 消费者1 消费者2 消费者3 发布订阅模型(Pub/Sub) 行情生产者 行情Topic 交易引擎 风控系统 监控平台 点对点:一条消息一个消费者 | 发布订阅:一条消息多个消费者

2.6 性能与可靠性权衡

选模型时,还得考虑性能和可靠性。我直接说结论:

  • 点对点模型:性能更高,因为消息不需要复制给多个消费者。但可靠性依赖队列的持久化机制。
  • 发布订阅模型:灵活性更高,但性能开销大。每个订阅者都要独立消费,消息复制有成本。

我在做高频交易系统时,行情推送用的发布订阅,但做了优化——订阅者分组,同组内用点对点竞争消费。这样既保证了广播,又实现了负载均衡。

我的建议:别死磕一种模型。交易系统里,灵活组合才是王道。先画清楚数据流图,再决定每个环节用什么模型。模型选对了,后面少改很多代码。

好了,关于点对点和发布订阅,今天就聊这么多。记住一句话:点对点解决「谁来做」,发布订阅解决「谁知道」。交易场景下,两者缺一不可。