3. 事件风暴(Event Storming)入门

事件风暴是由 Alberto Brandolini 于 2013 年提出的一种协作式、基于黏性便签的领域建模工作坊技术。它通过将业务专家、开发人员、产品经理等角色聚集在同一面“墙”前,以领域事件为时间轴,快速探索业务全貌、发现核心问题域,并最终产出领域模型与限界上下文。本章将系统介绍事件风暴的起源、四种核心元素以及标准工作坊流程,为后续在订单系统中实战应用打下坚实基础。

核心观点:事件风暴不是一种“文档技术”,而是一种“对话技术”。它的价值在于通过高密度的协作,消除认知偏差,让所有参与者对业务达成共识。

3.1 事件风暴的起源

事件风暴诞生于 DDD(领域驱动设计)社区对传统建模方法的反思。Brandolini 发现,传统的 UML 建模会议往往由架构师主导,业务专家被动参与,导致模型严重偏离真实业务。他提出了一种“反会议”式的建模方式:

  • 时间轴驱动:以“过去发生了什么 → 现在发生了什么 → 未来会发生什么”为线索,而非以系统功能或数据库表结构为线索。
  • 大规模协作:一次工作坊通常邀请 10–30 人,包括业务专家、领域专家、开发、测试、运维、产品经理等。
  • 低门槛工具:仅需一面足够大的墙、大量不同颜色的黏性便签和马克笔,无需任何建模工具或 IDE。
  • 快速迭代:一次工作坊通常持续 2–4 小时,即可产出可落地的领域模型草图。

事件风暴最初在意大利的金融科技公司被验证,随后在 DDD 社区迅速传播,成为目前最流行的领域建模实践之一。它特别适合复杂业务系统的初始建模、遗留系统重构、以及微服务拆分场景。

适用场景提示:如果你的团队正在开发一个全新的订单系统,或者正在将单体订单系统拆分为微服务,事件风暴是启动阶段最高效的建模工具。

3.2 四种核心元素

事件风暴使用四种不同颜色的便签来代表四种核心建模元素。每种元素都有严格的语义和放置规则。下表总结了它们的定义、颜色约定和示例:

元素 便签颜色 定义 订单系统示例
Domain Event
(领域事件)
橙色 业务中已经发生的、不可改变的事实。通常使用过去时态命名。 订单已创建、支付已成功、库存已扣减、物流已发货
Command
(命令)
蓝色 触发领域事件的用户意图或系统指令。通常使用祈使句命名。 创建订单、提交支付、确认发货、取消订单
Aggregate
(聚合)
黄色 一组具有事务一致性的领域对象集合,是命令的执行者和事件的产生者。 订单聚合(Order)、支付聚合(Payment)、库存聚合(Inventory)
Policy
(策略/规则)
紫色 当某个领域事件发生后,自动触发的业务规则或流程。通常表现为“当……时,执行……”。 当支付成功时,自动扣减库存;当订单超时未支付时,自动取消订单

四种元素之间的关系可以概括为:用户或系统发出 Command → 由 Aggregate 处理 → 产生一个或多个 Domain Event → 某些 Domain Event 会触发 Policy → Policy 可能发出新的 Command。这个循环构成了事件风暴建模的基本单元。

常见误区:不要将 Domain Event 与系统日志或消息队列中的事件混淆。Domain Event 是业务语义上的事实,而不是技术实现上的消息。例如,“订单已创建”是一个 Domain Event,而“订单数据已写入数据库”则不是。

3.3 四种核心元素关系图

下图展示了 Command、Aggregate、Domain Event 和 Policy 之间的典型协作关系。这是事件风暴建模中最核心的“事件循环”模式。

事件风暴四种核心元素关系图 用户/外部系统 Command Aggregate Domain Event Policy 发出 执行 产生 触发 发出新 说明:Policy 是事件风暴中连接“事件”与“命令”的桥梁,它体现了业务中的自动化规则。 例如:当“支付已成功”事件发生时,Policy 自动发出“扣减库存”命令。

3.4 工作坊流程

一次标准的事件风暴工作坊通常包含以下 5 个阶段。每个阶段都有明确的目标、产出物和参与者角色。

阶段 1:混沌探索(Chaotic Exploration)

  • 目标:在不受约束的情况下,尽可能多地收集领域事件。
  • 活动:所有参与者使用橙色便签,在墙上贴出他们认为业务中发生的所有事件。不讨论、不质疑、不排序。
  • 产出:一面贴满橙色便签的“事件墙”,通常包含 50–200 个领域事件。
  • 时间:30–45 分钟。

阶段 2:时间线排序(Timeline Ordering)

  • 目标:将混沌的事件按时间顺序排列,形成业务的时间轴。
  • 活动:团队一起将橙色便签从左到右(或从上到下)按发生的时间顺序排列。发现缺失的事件时,随时补充。
  • 产出:一条清晰的事件时间线,通常以“开始”和“结束”事件为边界。
  • 时间:20–30 分钟。

阶段 3:命令与聚合识别(Command & Aggregate Identification)

  • 目标:为每个领域事件找到触发它的命令,以及执行该命令的聚合。
  • 活动:在每个橙色事件左侧贴上蓝色便签(Command),在蓝色便签下方贴上黄色便签(Aggregate)。
  • 产出:事件、命令、聚合三者对齐的“三明治”结构。
  • 时间:30–45 分钟。

阶段 4:策略与规则发现(Policy Discovery)

  • 目标:识别事件之间的自动触发规则。
  • 活动:在需要自动触发的事件之间贴上紫色便签(Policy),并用箭头连接。例如:事件 A → Policy → 命令 B。
  • 产出:完整的“事件 → 策略 → 命令”链路。
  • 时间:20–30 分钟。

阶段 5:限界上下文划分(Bounded Context Partitioning)

  • 目标:根据聚合的归属和业务语义,将整个模型划分为多个限界上下文。
  • 活动:使用粗马克笔或胶带,在墙上画出边界线,将相关的聚合和事件圈在一起。为每个上下文命名。
  • 产出:限界上下文地图,每个上下文包含一组聚合、事件和策略。
  • 时间:20–30 分钟。
工作坊黄金法则:
  1. 先发散,后收敛:阶段 1 和 2 鼓励发散,阶段 3–5 逐步收敛。
  2. 尊重便签颜色:不要混用颜色,每种颜色有严格的语义。
  3. 允许“我不知道”:遇到不确定的事件或命令时,贴上问号便签,后续由领域专家补充。
  4. 拍照存档:工作坊结束后,对整面墙进行高清拍照,作为后续建模的原始素材。

3.5 工作坊流程总览图

下图将上述 5 个阶段整合为一个完整的流程视图,展示了从混沌探索到限界上下文划分的演进路径。

事件风暴工作坊 5 阶段流程 阶段 1 混沌探索 阶段 2 时间线排序 阶段 3 命令与聚合识别 阶段 4 策略与规则发现 阶段 5 限界上下文划分 收敛 各阶段核心产出 阶段1: 事件墙 → 阶段2: 事件时间线 → 阶段3: 事件-命令-聚合三明治 阶段4: 策略链路 → 阶段5: 限界上下文地图

3.6 本章小结

  • 事件风暴是一种协作式领域建模技术,起源于 DDD 社区,强调“对话”而非“文档”。
  • 四种核心元素:Domain Event(橙色)、Command(蓝色)、Aggregate(黄色)、Policy(紫色),它们构成了事件风暴建模的基本语法。
  • 工作坊流程包含 5 个阶段:混沌探索 → 时间线排序 → 命令与聚合识别 → 策略与规则发现 → 限界上下文划分。
  • 事件风暴的最终产出是限界上下文地图,它直接指导微服务拆分和聚合设计。