4. 事件风暴画布基础:起源、角色与工作坊流程

事件风暴(Event Storming)由 Alberto Brandolini 于 2013 年提出,是一种基于协作的、高度互动的建模方法。它通过将领域专家、开发人员、产品经理等角色聚集在同一面“墙”前,使用彩色便签纸快速探索业务全貌,识别核心领域事件、命令与聚合。在《OAuth2.0 集成下的分布式事务事件风暴画布安全架构》课程中,事件风暴是连接安全策略与分布式系统设计的核心桥梁。

4.1 事件风暴的起源与核心理念

事件风暴的诞生源于对传统需求分析“信息漏斗”的反思。Brandolini 观察到,从业务专家到开发人员的需求传递过程中,大量上下文与业务规则丢失。事件风暴通过以下原则解决该问题:

  • 时间线驱动:以“事件”作为时间轴上的锚点,描述系统“发生了什么”。
  • 大规模协作:所有利益相关者同时参与,消除信息孤岛。
  • 物理空间优先:使用实体墙、便签纸和马克笔,降低建模门槛,提升参与感。
  • 探索而非设计:初期不关注技术实现,只关注业务行为与规则。
课程提示: 在 OAuth2.0 集成场景中,事件风暴特别适合用来发现“令牌颁发”、“授权码交换”、“刷新令牌”等关键业务事件,以及这些事件触发的分布式事务边界。

4.2 核心角色与彩色便签语义

事件风暴使用不同颜色的便签纸代表不同的建模元素。下表总结了五种核心角色及其在安全架构上下文中的映射:

角色 便签颜色 定义 OAuth2.0 安全上下文示例
Domain Event 橙色 发生在过去、不可改变的业务事实。通常使用过去时态命名。 AccessTokenIssued、RefreshTokenRevoked、AuthorizationCodeExchanged
Command 蓝色 用户或系统发起的意图,触发一个事件。通常使用祈使句命名。 IssueAccessToken、ValidateClientCredentials、ExchangeAuthorizationCode
Aggregate 黄色 一组领域对象的集合,保证业务不变量的执行边界。是事务一致性的最小单元。 ClientApplication、UserSession、AuthorizationGrant
Policy 紫色 当某个事件发生时,自动触发另一个命令或事件的业务规则。 当 RefreshTokenExpired 时,触发 RevokeRefreshToken 命令
External System / Actor 粉色 与系统交互的外部角色或系统,通常是人或第三方服务。 资源拥有者(用户)、授权服务器、资源服务器
关键区别: Command 是“想要做什么”,Domain Event 是“已经做了什么”。在分布式事务中,Command 可能失败,而 Domain Event 一旦发布,即代表不可变的事实。

4.3 事件风暴工作坊流程

一个标准的事件风暴工作坊通常分为四个阶段,每个阶段都有明确的产出物。以下流程适用于 OAuth2.0 集成场景的建模:

  1. 混沌探索(Chaotic Exploration)
    • 目标:快速收集所有可能的 Domain Event,不讨论细节。
    • 活动:参与者自由地在墙上贴橙色便签,描述“系统发生了什么”。
    • 产出:一面贴满橙色便签的墙,覆盖从“用户发起登录”到“令牌过期”的完整生命周期。
  2. 时间线排序(Timeline Sorting)
    • 目标:将混沌的事件按时间顺序排列,形成从左到右的时间线。
    • 活动:集体讨论事件的前后依赖关系,移动便签位置。
    • 产出:清晰的时间线,暴露出事件之间的因果链。
  3. 命令与聚合识别(Command & Aggregate Identification)
    • 目标:为每个事件找到触发它的 Command,并定义执行 Command 的 Aggregate。
    • 活动:在事件左侧贴上蓝色 Command,在事件上方贴上黄色 Aggregate。
    • 产出:形成“Command → Aggregate → Event”的基本建模单元。
  4. 边界与策略发现(Boundary & Policy Discovery)
    • 目标:识别聚合之间的边界(即分布式事务边界),并定义跨边界的 Policy。
    • 活动:用紫色便签标记 Policy,用粗线画出聚合边界。
    • 产出:包含聚合边界、事件流和自动触发规则的事件风暴画布。
事件风暴核心角色关系图 事件风暴核心角色关系 外部系统/参与者 Command Aggregate Domain Event Policy 发起 执行于 产生 触发 说明:Command 由外部系统发起,在 Aggregate 内执行,产生 Domain Event;Policy 监听事件并触发新的 Command。 在 OAuth2.0 中,AuthorizationGrant 是典型的 Aggregate,保证授权码只能被兑换一次。

4.4 事件风暴画布与分布式事务的映射

在分布式系统中,一个 Aggregate 对应一个事务边界。事件风暴画布上的每个黄色便签(Aggregate)都代表一个需要保证强一致性的数据范围。跨聚合的操作必须通过最终一致性(如事件驱动)来实现。下表总结了画布元素与分布式事务概念的对应关系:

事件风暴元素 分布式事务概念 OAuth2.0 集成示例
Aggregate 本地事务边界 / 聚合根 ClientApplication 聚合保证客户端凭证的唯一性
Domain Event 不可变消息 / 事件溯源日志 AccessTokenIssued 事件记录令牌颁发事实
Command RPC 调用 / 服务请求 ValidateToken 命令调用资源服务器验证接口
Policy Saga 协调器 / 事件处理器 当 RefreshTokenExpired 时,Policy 触发 NotifyUser 命令
聚合边界 微服务拆分边界 授权服务器与资源服务器之间的边界
安全架构注意: 在 OAuth2.0 集成中,AuthorizationCode 的消费必须在一个 Aggregate 内完成(强一致性),而令牌的撤销通知可以跨聚合通过事件传播(最终一致性)。错误地将撤销逻辑放在同一个 Aggregate 内会导致不必要的锁竞争。
事件风暴工作坊四阶段流程 事件风暴工作坊四阶段流程 阶段 1 混沌探索 收集所有 Domain Event 阶段 2 时间线排序 按因果顺序排列事件 阶段 3 命令与聚合识别 定义 Command 和 Aggregate 阶段 4 边界与策略 发现 Policy 产出物:从一面混乱的橙色便签墙,逐步演化为包含时间线、聚合边界、命令和策略的结构化画布。 在 OAuth2.0 场景中,最终画布应清晰展示授权码流程、令牌颁发、刷新与撤销的完整事件流。 迭代反馈循环

4.5 在 OAuth2.0 集成中的实践建议

  • 从令牌生命周期开始:先列出所有与令牌相关的事件(颁发、刷新、撤销、过期),再补充客户端注册、用户授权等外围事件。
  • 明确聚合边界:AuthorizationGrant(授权码)和 AccessToken(访问令牌)应作为独立的聚合,因为它们具有不同的生命周期和一致性要求。
  • Policy 驱动自动化:使用 Policy 描述“令牌过期后自动刷新”或“授权码使用后自动失效”等规则,这些规则在分布式系统中通常由事件处理器或 Saga 协调器实现。
  • 安全事件不可忽略:在事件风暴中,务必包含安全相关事件,如 InvalidClientCredentialsDetected、TokenReplayAttempted,这些事件是安全审计和威胁建模的基础。