4. 识别领域事件:从业务流程中提取关键事件

领域事件(Domain Event)是事件风暴的核心产出,它记录了业务中发生的、对后续流程有影响的事实。在分布式事务场景下,领域事件往往对应着跨服务的数据变更、状态转移或补偿触发点。本节将引导你从业务流程中系统性地提取这些关键事件。

4.1 领域事件的定义与特征

一个合格的领域事件必须满足以下特征:

特征 说明 反例
过去时态 事件名称必须是已经发生的动作,使用过去分词 “订单已创建” ✅ / “创建订单” ❌
业务有意义 事件对业务方或下游系统有实际价值 “数据库行已插入” ❌
不可变事实 事件一旦发生,不能被修改或撤销,只能通过补偿事件对冲 “订单金额已修改” ❌(应使用“订单金额已更正”)
触发后续动作 事件通常会被一个或多个订阅者消费,驱动下一步流程 “日志已记录” ❌(通常不触发业务动作)
命名规范: 推荐使用 {业务主体}已{过去分词} 格式,例如:订单已提交、库存已预占、支付已成功。保持全团队统一,避免歧义。

4.2 从业务流程到事件列表:三步提取法

以下方法适用于任何业务领域,尤其适合分布式事务场景下的复杂流程梳理。

  1. 步骤一:绘制流程泳道 —— 将参与方(用户、前端、订单服务、支付服务、库存服务等)按泳道排列,画出主流程和异常分支。
  2. 步骤二:标记状态变化点 —— 在每个泳道中,找到业务对象(订单、支付单、库存记录)发生状态变更的位置,这些位置就是事件的候选点。
  3. 步骤三:用橙色便签写出事件 —— 将每个状态变化点用“过去时态”短语写在橙色便签上,贴在对应泳道的时序位置。
实战案例: 以“电商下单”流程为例,从“用户点击提交”到“订单完成”,我们按三步法提取出以下候选事件:
订单已提交 → 库存已预占 → 支付已发起 → 支付已成功 → 订单已确认 → 库存已扣减 → 订单已完成

4.3 分布式事务场景下的关键事件分类

在分布式事务环境中,领域事件需要额外关注事务边界和补偿逻辑。我们将事件分为三类:

事件类型 作用 典型示例 事务语义
正向事件 推进主流程前进 订单已提交、支付已成功 Try / Confirm 阶段
补偿事件 回滚或撤销已发生的正向操作 库存预占已释放、支付已退款 Cancel 阶段
超时/异常事件 标记流程超时或系统异常 支付超时已触发、库存预占失败 异常处理阶段

在事件风暴画布上,建议使用不同颜色的便签区分这三类事件:

  • 橙色 —— 正向事件(标准领域事件)
  • 粉色/红色 —— 补偿事件
  • 黄色 —— 超时/异常事件

4.4 事件提取实战:分布式事务下单流程

以下是一个典型的 TCC(Try-Confirm-Cancel)分布式事务场景,我们从中提取完整的领域事件列表。

分布式事务下单流程 — 领域事件提取 用户端 订单服务 支付服务 库存服务 消息总线 订单已提交 库存已预占 支付已发起 支付已成功 订单已确认 库存已扣减 订单已完成 正向事件 确认事件 终态事件

上图展示了从“订单已提交”到“订单已完成”的完整事件链。注意:支付已成功 和 库存已扣减 使用绿色标记,表示它们是确认阶段的关键事件,一旦发生即不可回滚。

4.5 补偿事件与异常事件识别

在分布式事务中,补偿事件与正向事件同等重要。以下表格展示了上述流程中可能出现的补偿/异常事件:

触发条件 补偿/异常事件 类型 影响
库存预占失败 库存预占已失败 异常事件 订单进入“待补货”或“已取消”
支付超时 支付超时已触发 异常事件 触发库存预占释放
支付失败后回滚 库存预占已释放 补偿事件 库存恢复可用数量
订单取消 订单已取消 补偿事件 触发支付退款 + 库存释放
支付退款完成 支付已退款 补偿事件 资金返回用户账户
关键原则: 每个正向事件都应该有对应的补偿事件,除非该事件已经进入不可逆的终态(如“支付已成功”)。补偿事件的设计直接决定了分布式事务的回滚能力,是 Saga 和 TCC 模式的核心。

4.6 事件风暴画布上的事件组织

在事件风暴工作坊中,提取出的事件需要按照时间顺序从左到右排列在画布上。以下是组织建议:

  • 时间轴:从左到右表示时间推进,越靠右的事件发生时间越晚。
  • 泳道对齐:事件贴在对应服务/参与方的泳道内,便于识别事件归属。
  • 分组标记:使用虚线框将一组相关事件圈起来,表示一个事务边界(Saga 或 TCC 阶段)。
  • 颜色编码:严格遵循正向(橙色)、补偿(粉色/红色)、异常(黄色)的颜色规则,便于视觉扫描。
事件风暴画布 — 事件组织示例 订单服务 支付服务 库存服务 Try 阶段 订单已提交 支付已发起 库存已预占 Confirm 阶段 支付已成功 订单已确认 库存已扣减 Cancel 订单已取消 支付已退款 库存已释放

上图展示了事件在画布上的组织方式:Try 阶段(蓝色虚线框)包含正向事件,Confirm 阶段(绿色虚线框)包含确认事件,Cancel 阶段(红色虚线框)包含补偿事件。这种分组方式让事务边界一目了然。

4.7 事件提取检查清单

完成事件提取后,使用以下清单进行质量检查:

  • ✅ 所有事件名称使用过去时态
  • ✅ 每个事件都有明确的触发者(用户、定时器、其他事件)
  • ✅ 每个事件都有至少一个订阅者(后续动作)
  • ✅ 正向事件与补偿事件成对出现(终态事件除外)
  • ✅ 异常事件覆盖了超时、失败、拒绝等场景
  • ✅ 事件在画布上按时间顺序从左到右排列
  • ✅ 事件颜色编码与类型一致
  • ✅ 事务边界(Try/Confirm/Cancel)已用虚线框标记