事件驱动设计与消息驱动设计
发布: (2026年1月19日 GMT+8 11:11)
3 min read
原文: Dev.to
Source: Dev.to
事件驱动设计 (EDD)
在深入 EDD 之前,先来定义一下 事件。事件是不可变的,表示过去的状态变化。
EDD 的核心思想是系统对事件作出响应——即对已经发生的事实作出反应。在 EDD 中,生产者并不知道谁会消费这些事件,从而实现高度解耦。
- 一个服务执行某个操作。
- 它发布一个事件。
- 零个或多个消费者独立地作出响应。
示例: 订单服务成功创建订单并发出一个事件。
潜在的消费者
- 库存服务减少库存
- 邮件服务发送确认邮件
- 分析服务跟踪指标
一个常见的误区是期待从事件中得到回复。事件是单向通知,而不是对话。当你发布一个事件时,你是在说“这件事已经发生”,而不是“请回复”。
消息驱动设计 (MDD)
与已经发生的事情作出反应的 EDD 不同,MDD 指示服务执行操作。这类系统发送 消息 来请求另一个系统完成工作。
- 消息基于意图(例如
ProcessPayment、SendEmail、GenerateInvoice)。 - 发送方通常期望处理能够进行。
流程
- 发送方发送一条消息。
- 接收方处理该消息。
- 可选的响应或确认。
示例: 订单服务向支付服务发送 ProcessPayment 消息。
在 EDD 与 MDD 之间的选择
一个有用的思维模型是:一种是 响应式,另一种是 指令式:
- 响应式:“订单已下达。”(事件)
- 指令式:“下达订单。”(消息)
大多数现代架构会将两者结合使用,命令(消息)启动工作,事件则宣布结果。
综合示例
Checkout Service
├─ sends → ProcessPayment (message)
└─ publishes → PaymentCompleted (event)