3. 事件风暴基础:起源、角色、准备与基本流程

事件风暴(Event Storming)是由 Alberto Brandolini 于 2013 年提出的一种协作式建模方法。它通过高密度、高互动的工作坊形式,将领域专家、开发人员、产品经理和架构师聚集在同一张“画布”前,快速发现业务核心流程、识别领域事件、界定系统边界。在分布式事务与事件驱动架构的落地过程中,事件风暴是连接业务需求与技术实现的“翻译器”。

3.1 事件风暴的起源

Alberto Brandolini 在多年的 DDD 咨询实践中发现,传统的 UML 建模和文档驱动方式存在三大痛点:

  • 信息失真:业务知识经过多次转述后,关键细节丢失。
  • 参与门槛高:领域专家难以理解技术建模符号,技术人员难以理解业务术语。
  • 反馈周期长:模型交付后才发现理解偏差,返工成本极高。

事件风暴的核心理念是:让业务人员用自己熟悉的语言(事件、命令、角色)直接参与建模。通过即时贴(Post-it)和大幅画布,所有参与者可以同时表达、讨论、修正,在数小时内完成传统方法数周才能完成的领域探索。

关键洞察:事件风暴不是一种“建模语言”,而是一种“建模仪式”。它依赖物理空间的互动和即时反馈,而非静态文档。

3.2 事件风暴中的核心角色

一次成功的事件风暴工作坊需要以下角色协同工作。每个角色都有明确的职责和参与方式。

角色 职责 参与方式
领域专家 提供业务知识、规则、异常场景和术语定义 全程参与,主导事件和命令的产出
技术团队 评估技术可行性、识别集成点、设计聚合边界 观察、提问、记录技术约束
引导师 控制节奏、保持焦点、解决冲突、确保产出 中立角色,不参与业务讨论
产品经理 确认业务价值、优先级和用户故事 提供上下文,但不主导技术决策
记录员 拍照、整理即时贴、维护数字副本 不参与讨论,专注记录
常见误区:引导师不应由技术负责人兼任。技术负责人容易陷入技术细节,导致业务探索不充分。建议由经验丰富的敏捷教练或独立架构师担任。

3.3 准备工作清单

事件风暴的产出质量高度依赖准备工作。以下清单确保工作坊能够高效进行:

  1. 物理空间:至少一面 3m × 2m 的白板墙或可粘贴画布,确保所有参与者能同时看到全部内容。
  2. 物料准备:不同颜色的即时贴(建议 76mm × 76mm 以上)、粗头马克笔(黑色、蓝色、红色)、胶带、相机或手机。
  3. 参与者邀请:确保核心领域专家全程参与,技术团队不超过总人数的 40%。
  4. 范围界定:提前与产品经理确认本次探索的业务流程边界(例如:仅限“订单创建”到“订单发货”)。
  5. 时间预算:单次工作坊建议 3-4 小时,中间安排 15 分钟休息。超过 4 小时需要分两天进行。
  6. 数字工具备选:远程场景下可使用 Miro、Mural 或 Lucidchart 的“事件风暴模板”,但效率通常低于线下。

3.4 基本流程:时间线、命令、事件与聚合

事件风暴的基本流程遵循“从左到右、从粗到细”的演进逻辑。以下 SVG 展示了核心元素在画布上的布局关系:

事件风暴画布基本元素布局 事件风暴画布基本元素布局 时间线 提交订单 命令(橙色) 订单已提交 事件(蓝色) 订单聚合 聚合(绿色) 支付系统 外部系统(紫色) 画布阅读规则 • 从左到右:时间线方向,越靠右的事件发生时间越晚 • 命令(橙色)触发事件(蓝色),事件驱动聚合(绿色)状态变更 • 外部系统(紫色)表示与当前聚合交互的边界系统 命令 → 事件 → 聚合 → 外部系统

3.4.1 时间线(Timeline)

时间线是画布的水平主轴,通常从左到右表示业务过程的先后顺序。所有事件、命令和聚合都按照时间线排列。时间线不要求严格精确到秒,只需保持相对顺序即可。例如:“订单已提交”一定在“订单已支付”之前。

3.4.2 命令(Command)

命令是用户或外部系统发出的意图,用橙色即时贴表示。命令的命名格式为“动词 + 宾语”,例如“提交订单”、“取消订单”、“修改地址”。命令是事件的直接原因,但命令本身不保证成功——它可能被拒绝或失败。

命令与事件的关系:命令是“请求”,事件是“事实”。一个命令可能产生多个事件(成功事件 + 失败事件),也可能不产生事件(被忽略)。

3.4.3 事件(Event)

事件是已经发生的、不可改变的事实,用蓝色即时贴表示。事件的命名格式为“名词 + 已 + 动词过去式”,例如“订单已提交”、“支付已成功”、“库存已扣减”。事件是领域专家最容易产出的元素,也是事件风暴的起点。

在分布式事务场景中,事件是最终一致性的核心载体。每个事件都应该包含足够的信息让消费者独立处理,而不需要回查源系统。

3.4.4 聚合(Aggregate)

聚合是领域驱动设计中的一致性边界,用绿色即时贴表示。聚合封装了一组业务对象,确保它们的状态变更满足业务规则。在事件风暴中,聚合通常出现在事件之后,表示“这个事件改变了哪个聚合的状态”。

聚合的识别原则:

  • 一致性边界:一个事务内只能修改一个聚合实例。
  • 聚合根:每个聚合有一个根实体,外部只能通过根访问聚合内部。
  • 大小适中:聚合不应过大(避免性能问题),也不应过小(失去封装意义)。

3.5 事件风暴的典型流程步骤

以下步骤是标准事件风暴工作坊的执行顺序:

步骤 活动 产出物 耗时(分钟)
1 混沌探索:所有参与者自由粘贴事件,不讨论、不排序 50-100 个无序事件 20-30
2 时间线排序:引导师带领大家将事件按时间线排列 有序事件流 15-20
3 命令识别:为每个事件找出触发它的命令 命令-事件对 15-20
4 聚合发现:识别事件所属的聚合边界 聚合分组 20-30
5 外部系统标注:标记与聚合交互的外部系统 系统上下文图 10-15
6 验证与调整:走读整个流程,修正遗漏或错误 最终画布 20-30

以下 SVG 展示了从混沌探索到聚合识别的完整流程:

事件风暴工作坊流程步骤 事件风暴工作坊流程步骤 混沌探索 无序事件 时间线排序 有序事件流 命令识别 命令-事件对 聚合发现 聚合分组 外部系统标注 系统上下文 验证与调整 最终画布 迭代修正 提示:步骤 1-2 通常由领域专家主导,步骤 3-4 需要技术团队参与,步骤 5-6 是全员协作。如果发现重大遗漏,可以随时回到步骤 1 补充事件。

3.6 事件风暴与分布式事务的关联

在分布式事务场景中,事件风暴产出的“事件”和“聚合”直接对应到技术实现中的关键元素:

  • 事件 → 消息队列中的事件消息(如 Kafka、RabbitMQ)。
  • 聚合 → 微服务中的一致性边界(一个聚合通常对应一个微服务或一个限界上下文)。
  • 命令 → API 接口或消息命令(Command Message)。
  • 外部系统 → 第三方服务或遗留系统。
实践建议:在事件风暴工作坊中,不要过早讨论技术实现(如消息队列选型、事务协议)。先确保业务模型正确,技术方案可以在后续的“架构决策记录”中补充。

通过以上流程,团队可以在数小时内完成从业务混沌到结构化领域模型的转变,为后续的分布式事务设计(如 Saga、事件溯源、CQRS)奠定坚实的业务基础。