事件驱动设计与消息驱动设计

发布: (2026年1月19日 GMT+8 11:11)
3 min read
原文: Dev.to

Source: Dev.to

事件驱动设计 (EDD)

在深入 EDD 之前,先来定义一下 事件。事件是不可变的,表示过去的状态变化。
EDD 的核心思想是系统对事件作出响应——即对已经发生的事实作出反应。在 EDD 中,生产者并不知道谁会消费这些事件,从而实现高度解耦。

  1. 一个服务执行某个操作。
  2. 它发布一个事件。
  3. 零个或多个消费者独立地作出响应。

示例: 订单服务成功创建订单并发出一个事件。

潜在的消费者

  • 库存服务减少库存
  • 邮件服务发送确认邮件
  • 分析服务跟踪指标

一个常见的误区是期待从事件中得到回复。事件是单向通知,而不是对话。当你发布一个事件时,你是在说“这件事已经发生”,而不是“请回复”。


消息驱动设计 (MDD)

与已经发生的事情作出反应的 EDD 不同,MDD 指示服务执行操作。这类系统发送 消息 来请求另一个系统完成工作。

  • 消息基于意图(例如 ProcessPaymentSendEmailGenerateInvoice)。
  • 发送方通常期望处理能够进行。

流程

  1. 发送方发送一条消息。
  2. 接收方处理该消息。
  3. 可选的响应或确认。

示例: 订单服务向支付服务发送 ProcessPayment 消息。


在 EDD 与 MDD 之间的选择

一个有用的思维模型是:一种是 响应式,另一种是 指令式

  • 响应式:“订单已下达。”(事件)
  • 指令式:“下达订单。”(消息)

大多数现代架构会将两者结合使用,命令(消息)启动工作,事件则宣布结果。

综合示例

Checkout Service
   ├─ sends → ProcessPayment (message)
   └─ publishes → PaymentCompleted (event)
Back to Blog

相关文章

阅读更多 »

消息传递与事件驱动设计

事件驱动架构(EDA)是一种现代模式,由小型、解耦的服务构建,这些服务发布、消费或路由事件。- 即使…

大脱钩:企业能力图

《伟大解耦》系列第二部分 在第一部分中,我指出我们正目睹能力与呈现的解耦——即 SaaS 界面,远…

从领域事件到Webhooks

领域事件实现以下接口: ```php interface DomainEvent { public function aggregateRootId: string; public function displayReference: st... } ```