3. 事件风暴画布设计:画布布局、时间轴与泳道划分原则
事件风暴画布是分布式事务建模的核心载体,它将领域事件、命令、聚合、策略与外部系统映射到一张二维空间上。画布布局、时间轴方向与泳道划分方式直接决定了建模的可读性、完整性与可扩展性。本节从物理布局、时间推进逻辑与角色/系统隔离三个维度给出设计原则。
3.1 画布标准布局
一张完整的事件风暴画布由三个横向区域与一个纵向时间轴构成。横向区域按“命令层 → 事件层 → 反应层”自上而下排列;纵向时间轴从左向右推进。标准布局如下表所示:
| 区域 | 颜色标识 | 内容 | 典型元素 |
|---|---|---|---|
| 命令层 | 蓝色便签 (#3498db) | 触发事件的用户操作或系统指令 | “提交订单”、“发起支付”、“确认发货” |
| 事件层 | 橙色便签 (#f39c12) | 已发生的不可变事实,带过去时态 | “订单已创建”、“支付已成功”、“库存已扣减” |
| 反应层 | 绿色便签 (#2ecc71) | 事件触发的后续动作或策略 | “发送通知”、“启动补偿”、“更新对账” |
布局原则:命令层与事件层之间保持 40–60px 间距,便于粘贴聚合边界线;事件层与反应层之间留出泳道标签区域。所有便签统一使用 76mm × 76mm 标准尺寸(线上工具可等比缩放)。
3.2 时间轴方向与粒度
时间轴是事件风暴画布的主干,所有事件按发生顺序从左向右排列。时间轴设计需遵循以下原则:
- 单向递增:时间轴始终从左向右推进,不允许回退分支。补偿事件(如“支付已回滚”)作为独立事件放在正常事件之后,而非画在时间轴上方。
- 粒度统一:一个业务用例(如“下单-支付-发货”)使用同一时间粒度(秒级或分钟级),避免将秒级事件与天级事件混排在同一画布上。
- 里程碑标记:在时间轴下方使用紫色菱形 (#9b59b6) 标记 Saga 协调点(如“事务开始”、“事务结束”、“补偿触发”),帮助识别分布式事务边界。
避坑提示:不要把“查询”类操作放在时间轴上。查询不改变状态,不属于事件。只有产生新事实的操作(命令→事件)才进入时间轴。
3.3 泳道划分原则
泳道用于隔离不同参与者或限界上下文。在分布式事务场景中,泳道划分直接影响 Saga 协调逻辑的清晰度。推荐以下三种泳道划分策略:
- 按限界上下文划分:每个微服务一个泳道(订单服务、支付服务、库存服务)。适合服务边界清晰、团队独立的场景。
- 按角色划分:用户、系统、外部合作伙伴各占一个泳道。适合包含外部 API 调用或人工审批的 Saga。
- 按事务角色划分:事务发起者、事务参与者、事务协调器各占一个泳道。适合需要显式展示 Saga 协调逻辑的复杂事务。
| 划分方式 | 适用场景 | 泳道数量 | 优点 | 缺点 |
|---|---|---|---|---|
| 限界上下文 | 微服务架构成熟 | 3–8 | 与代码结构对齐 | 跨泳道事件流密集 |
| 角色 | 包含人工操作 | 2–4 | 直观展示交互 | 角色可能跨多个服务 |
| 事务角色 | 复杂 Saga 编排 | 3–5 | 协调逻辑一目了然 | 需要额外泳道说明 |
3.4 画布布局与泳道集成 SVG
下图展示了一个包含三个泳道(订单服务、支付服务、库存服务)的事件风暴画布布局,时间轴从左向右推进,命令层、事件层、反应层自上而下排列:
3.5 泳道内事件流连接规则
事件在泳道之间的流动需要遵循明确的连接规则,避免画布出现交叉混乱。以下规则适用于分布式事务场景:
- 同泳道事件:使用实线箭头从左向右连接,表示同一服务内部的事件因果链。
- 跨泳道事件:使用虚线箭头,并在箭头上标注事件名称(如“支付已成功”从支付泳道指向订单泳道)。
- 补偿事件:使用红色虚线 (#e74c3c) 从补偿发起泳道指向被补偿泳道,箭头末端标注“补偿”。
- 聚合边界:使用圆角矩形框将同一聚合内的命令、事件、反应圈在一起,框线使用浅灰色 (#bdc3c7)。
重要:跨泳道事件必须显式标注事件名称,不能只画一条线而不说明传递的是什么事件。否则在后续 Saga 编排时,开发人员无法确定消息契约。
3.6 画布缩放与可读性控制
当事件风暴画布包含 30+ 事件时,可读性会急剧下降。建议采用以下控制策略:
| 策略 | 做法 | 适用场景 |
|---|---|---|
| 分阶段画布 | 将 Saga 拆为“正向流程”与“补偿流程”两张画布 | 正向事件 > 20 个 |
| 折叠泳道 | 将不参与当前阶段的服务泳道折叠为一条“外部系统”泳道 | 参与服务 > 6 个 |
| 事件分组 | 使用浅色背景框将同一事务阶段的事件圈在一起 | 事件跨度 > 30 分钟 |
| 数字编号 | 在事件左上角标注序号,与 Saga 编排步骤对应 | 需要与代码实现对齐 |
3.7 泳道划分与 Saga 协调器集成 SVG
下图展示了在“事务角色”泳道划分下,Saga 协调器作为独立泳道与各参与者泳道之间的交互关系。时间轴上的里程碑标记了协调器的决策点:
3.8 画布设计检查清单
完成画布设计后,建议对照以下清单进行自检:
- 时间轴方向统一从左向右,无回退分支
- 命令层、事件层、反应层三区清晰分离
- 泳道标签明确,每个泳道只包含一个参与者或限界上下文
- 跨泳道事件使用虚线箭头并标注事件名称
- 补偿事件使用红色虚线并标注“补偿”
- Saga 协调点使用紫色菱形标记
- 所有便签文字使用过去时态(事件)或祈使句(命令)
- 画布总事件数不超过 30 个,否则已拆分
实践建议:在第一次事件风暴工作坊中,使用物理便签和大幅白纸进行画布设计。物理便签可以随时移动、合并、删除,比线上工具更灵活。待画布稳定后再迁移到 Miro、Lucidchart 或 EventStorming 专用工具。