3. 事件风暴画布设计:画布布局、时间轴与泳道划分原则

事件风暴画布是分布式事务建模的核心载体,它将领域事件、命令、聚合、策略与外部系统映射到一张二维空间上。画布布局、时间轴方向与泳道划分方式直接决定了建模的可读性、完整性与可扩展性。本节从物理布局、时间推进逻辑与角色/系统隔离三个维度给出设计原则。

3.1 画布标准布局

一张完整的事件风暴画布由三个横向区域与一个纵向时间轴构成。横向区域按“命令层 → 事件层 → 反应层”自上而下排列;纵向时间轴从左向右推进。标准布局如下表所示:

区域 颜色标识 内容 典型元素
命令层 蓝色便签 (#3498db) 触发事件的用户操作或系统指令 “提交订单”、“发起支付”、“确认发货”
事件层 橙色便签 (#f39c12) 已发生的不可变事实,带过去时态 “订单已创建”、“支付已成功”、“库存已扣减”
反应层 绿色便签 (#2ecc71) 事件触发的后续动作或策略 “发送通知”、“启动补偿”、“更新对账”
布局原则:命令层与事件层之间保持 40–60px 间距,便于粘贴聚合边界线;事件层与反应层之间留出泳道标签区域。所有便签统一使用 76mm × 76mm 标准尺寸(线上工具可等比缩放)。

3.2 时间轴方向与粒度

时间轴是事件风暴画布的主干,所有事件按发生顺序从左向右排列。时间轴设计需遵循以下原则:

  • 单向递增:时间轴始终从左向右推进,不允许回退分支。补偿事件(如“支付已回滚”)作为独立事件放在正常事件之后,而非画在时间轴上方。
  • 粒度统一:一个业务用例(如“下单-支付-发货”)使用同一时间粒度(秒级或分钟级),避免将秒级事件与天级事件混排在同一画布上。
  • 里程碑标记:在时间轴下方使用紫色菱形 (#9b59b6) 标记 Saga 协调点(如“事务开始”、“事务结束”、“补偿触发”),帮助识别分布式事务边界。
避坑提示:不要把“查询”类操作放在时间轴上。查询不改变状态,不属于事件。只有产生新事实的操作(命令→事件)才进入时间轴。

3.3 泳道划分原则

泳道用于隔离不同参与者或限界上下文。在分布式事务场景中,泳道划分直接影响 Saga 协调逻辑的清晰度。推荐以下三种泳道划分策略:

  1. 按限界上下文划分:每个微服务一个泳道(订单服务、支付服务、库存服务)。适合服务边界清晰、团队独立的场景。
  2. 按角色划分:用户、系统、外部合作伙伴各占一个泳道。适合包含外部 API 调用或人工审批的 Saga。
  3. 按事务角色划分:事务发起者、事务参与者、事务协调器各占一个泳道。适合需要显式展示 Saga 协调逻辑的复杂事务。
划分方式 适用场景 泳道数量 优点 缺点
限界上下文 微服务架构成熟 3–8 与代码结构对齐 跨泳道事件流密集
角色 包含人工操作 2–4 直观展示交互 角色可能跨多个服务
事务角色 复杂 Saga 编排 3–5 协调逻辑一目了然 需要额外泳道说明

3.4 画布布局与泳道集成 SVG

下图展示了一个包含三个泳道(订单服务、支付服务、库存服务)的事件风暴画布布局,时间轴从左向右推进,命令层、事件层、反应层自上而下排列:

事件风暴画布布局 — 三泳道 + 时间轴 时间 → 订单服务 支付服务 库存服务 命令层 事件层 反应层 提交订单 发起支付 确认发货 订单已创建 支付已成功 库存已扣减 通知用户 启动补偿 更新对账 T0 T1 T2 泳道划分说明 按限界上下文划分 每个泳道一个微服务

3.5 泳道内事件流连接规则

事件在泳道之间的流动需要遵循明确的连接规则,避免画布出现交叉混乱。以下规则适用于分布式事务场景:

  • 同泳道事件:使用实线箭头从左向右连接,表示同一服务内部的事件因果链。
  • 跨泳道事件:使用虚线箭头,并在箭头上标注事件名称(如“支付已成功”从支付泳道指向订单泳道)。
  • 补偿事件:使用红色虚线 (#e74c3c) 从补偿发起泳道指向被补偿泳道,箭头末端标注“补偿”。
  • 聚合边界:使用圆角矩形框将同一聚合内的命令、事件、反应圈在一起,框线使用浅灰色 (#bdc3c7)。
重要:跨泳道事件必须显式标注事件名称,不能只画一条线而不说明传递的是什么事件。否则在后续 Saga 编排时,开发人员无法确定消息契约。

3.6 画布缩放与可读性控制

当事件风暴画布包含 30+ 事件时,可读性会急剧下降。建议采用以下控制策略:

策略 做法 适用场景
分阶段画布 将 Saga 拆为“正向流程”与“补偿流程”两张画布 正向事件 > 20 个
折叠泳道 将不参与当前阶段的服务泳道折叠为一条“外部系统”泳道 参与服务 > 6 个
事件分组 使用浅色背景框将同一事务阶段的事件圈在一起 事件跨度 > 30 分钟
数字编号 在事件左上角标注序号,与 Saga 编排步骤对应 需要与代码实现对齐

3.7 泳道划分与 Saga 协调器集成 SVG

下图展示了在“事务角色”泳道划分下,Saga 协调器作为独立泳道与各参与者泳道之间的交互关系。时间轴上的里程碑标记了协调器的决策点:

Saga 协调器泳道 — 事务角色划分 事务发起者 Saga 协调器 参与者 A 参与者 B 时间 → 开始 决策点 补偿 结束 发起事务 收到失败 编排步骤 1 编排步骤 2 触发补偿 完成回调 执行操作 A 补偿操作 A 执行操作 B 开始指令 执行 A 执行 B 成功 失败 补偿 最终结果 泳道划分说明 按事务角色划分 协调器独立泳道

3.8 画布设计检查清单

完成画布设计后,建议对照以下清单进行自检:

  • 时间轴方向统一从左向右,无回退分支
  • 命令层、事件层、反应层三区清晰分离
  • 泳道标签明确,每个泳道只包含一个参与者或限界上下文
  • 跨泳道事件使用虚线箭头并标注事件名称
  • 补偿事件使用红色虚线并标注“补偿”
  • Saga 协调点使用紫色菱形标记
  • 所有便签文字使用过去时态(事件)或祈使句(命令)
  • 画布总事件数不超过 30 个,否则已拆分
实践建议:在第一次事件风暴工作坊中,使用物理便签和大幅白纸进行画布设计。物理便签可以随时移动、合并、删除,比线上工具更灵活。待画布稳定后再迁移到 Miro、Lucidchart 或 EventStorming 专用工具。