name: 事件建模 description: Adam Dymitruk的事件建模方法论,包含泳道图 argument-hint: <流程> [–depth <概览|标准|详细>] [–output <ascii|mermaid|两者>] allowed-tools: 读, 全局, 搜索, 写, 编辑, 技能, 任务, mcp__perplexity__搜索
事件建模技能
何时使用此技能
在以下情况下使用此技能:
- 事件建模任务 - 处理Adam Dymitruk的事件建模方法论,包含泳道图
- 规划或设计 - 需要事件建模方法指导
- 最佳实践 - 希望遵循既定模式和标准
概述
使用Adam Dymitruk的可视化方法来设计事件驱动系统,创建事件模型。
强制:文档优先方法
在创建事件模型之前:
- 调用
docs-management技能获取事件建模模式 - 通过MCP服务器验证方法(如perplexity, eventmodeling.org)
- 基于Adam Dymitruk的原始方法指导
事件建模基础
事件建模结构:
时间从左到右流动 ───────────────────────────────────────────►
┌─────────────────────────────────────────────────────────────────────┐
│ 蓝色:用户界面 / 命令 / 外部触发器 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 屏幕/ │ │ 按钮 │ │ API │ │
│ │ 线框图 │ │ 点击 │ │ 调用 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
├──────┼─────────────┼─────────────┼──────────────────────────────────┤
│ ▼ ▼ ▼ │
│ 橙色:领域事件(状态变化) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 订单已下 │ │ 订单已付 │ │ 订单已发 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
├──────┼─────────────────┼───────────────┼────────────────────────────┤
│ ▼ ▼ ▼ │
│ 绿色:读模型 / 投影 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 订单列表 │ │ 支付 │ │ 发货 │ │
│ │ 视图 │ │ 状态 │ │ 仪表板 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
四种规范类型
1. 命令(蓝色泳道 - 顶部)
命令:可能导致状态变化的用户意图
特点:
- 代表用户操作或外部触发器
- 可能成功或失败(验证)
- 成功时产生一个或多个事件
- 包括用户界面命令的线框图/模拟
示例:
┌─────────────────────────────┐
│ 下订单 │
├─────────────────────────────┤
│ • 客户ID │
│ • 商品:[产品ID, 数量] │
│ • 配送地址 │
│ • 支付方式 │
└─────────────────────────────┘
2. 事件(橙色泳道 - 中间)
事件:已发生的事实(过去式,不可变)
特点:
- 过去式命名(如OrderPlaced,不是PlaceOrder)
- 记录后不可变
- 捕获发生了什么及何时发生
- 单一事实来源
命名约定:
✓ OrderPlaced
✓ PaymentReceived
✓ ShipmentDispatched
✗ PlaceOrder(命令,不是事件)
✗ OrderUpdate(太模糊)
示例:
┌─────────────────────────────┐
│ OrderPlaced │
├─────────────────────────────┤
│ • OrderId: guid │
│ • CustomerId: guid │
│ • Items: [...] │
│ • PlacedAt: timestamp │
│ • TotalAmount: decimal │
└─────────────────────────────┘
3. 读模型(绿色泳道 - 底部)
读模型:针对查询优化的投影
特点:
- 从事件构建
- 针对特定查询模式优化
- 可以从事件流重建
- 最终一致
类型:
- 列表视图(显示多项)
- 详情视图(单个项目详情)
- 仪表板(聚合)
- 搜索索引
示例:
┌─────────────────────────────┐
│ OrderSummaryView │
├─────────────────────────────┤
│ • OrderId │
│ • CustomerName │
│ • Status(派生) │
│ • ItemCount │
│ • TotalAmount │
│ • LastUpdated │
└─────────────────────────────┘
4. 自动化(政策/反应)
自动化:由事件触发的进程
特点:
- 自动响应事件
- 可能产生命令或集成外部系统
- 代表业务政策
- 处理异步处理
表示法:
┌─────────────────────────────┐
│ ⚡ PaymentReceivedPolicy │
├─────────────────────────────┤
│ WHEN: PaymentReceived │
│ THEN: InitiateShipment │
└─────────────────────────────┘
事件建模过程
步骤1:脑力激荡事件
脑力激荡所有领域事件(橙色便利贴):
1. 聚集利益相关者
2. 问:“这个进程中发生了什么?”
3. 以过去式写事件
4. 暂时不关心顺序
5. 包括所有重要状态变化
示例输出:
- OrderPlaced
- OrderConfirmed
- PaymentReceived
- PaymentFailed
- InventoryReserved
- ShipmentCreated
- ShipmentDispatched
- OrderDelivered
步骤2:安排时间线
按时间顺序组织事件:
1. 找到“快乐路径”事件
2. 从左到右排列
3. 垂直分组相关事件
4. 识别并行流
5. 注意时间依赖
时间线:
OrderPlaced → OrderConfirmed → PaymentReceived → InventoryReserved → ShipmentCreated → ShipmentDispatched → OrderDelivered
│
└→ PaymentFailed → OrderCancelled
步骤3:添加命令(蓝色)
什么触发每个事件?
对每个事件,问:
- 什么用户操作导致这个?
- 什么外部系统触发它?
- 是否有用户界面屏幕涉及?
添加命令在其产生的事件上方:
[PlaceOrder] → OrderPlaced
[ProcessPayment] → PaymentReceived
[DispatchShipment] → ShipmentDispatched
步骤4:添加读模型(绿色)
每个命令需要什么信息?
对每个命令,问:
- 用户需要看到什么数据?
- 需要什么验证数据?
- 什么视图支持这个操作?
添加读模型在填充它们的事件下方:
OrderPlaced → [OrderConfirmationView]
ShipmentDispatched → [TrackingDashboard]
步骤5:识别自动化
什么自动发生?
寻找:
- 触发其他事件的事件
- 与外部系统的集成
- 基于时间的规则
- 业务政策
示例:
PaymentReceived → ⚡ ReserveInventoryPolicy → InventoryReserved
事件模型模板
# 事件模型:[流程名称]
## 概述
[这个流程实现什么]
## 参与者
- [用户类型1]
- [用户类型2]
- [外部系统]
## 事件模型图
```text
时间 ──────────────────────────────────────────────────────────────►
命令(蓝色)
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 命令1 │ │ 命令2 │ │ 命令3 │ │ 命令4 │
└────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
│ │ │ │
▼ ▼ ▼ ▼
事件(橙色)
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 事件1 │───►│ 事件2 │───►│ 事件3 │───►│ 事件4 │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
│ │ │ │
▼ ▼ ▼ ▼
读模型(绿色)
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 视图1 │ │ 视图2 │ │ 视图3 │ │ 视图4 │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
命令详情
| 命令 | 输入 | 产生事件 | 所需读模型 |
|---|---|---|---|
| [名称] | [数据] | [事件] | [视图] |
事件详情
| 事件 | 数据 | 触发者 | 更新 |
|---|---|---|---|
| [名称] | [字段] | [命令/自动化] | [读模型] |
读模型详情
| 读模型 | 目的 | 更新事件 |
|---|---|---|
| [名称] | [它回答的查询] | [事件列表] |
自动化
| 自动化 | 触发事件 | 动作 | 产生 |
|---|---|---|---|
| [名称] | [事件] | [它做什么] | [事件/副作用] |
模式和指南
给定/当/时规范
每个切片可以表达为:
给定:[读模型状态 / 上下文]
当:[命令执行时]
时:[产生事件]
且:[读模型更新]
示例:
给定:购物车存在且有商品
当:执行下订单命令时
时:记录OrderPlaced事件
且:更新OrderSummaryView
且:触发InventoryReservationRequested事件
切片(垂直特性)
切片包括一个特性的所有内容:
┌─────────────────────────────┐
│ 切片1 │
│ ┌─────────────────────┐ │
│ │ 命令:下订单 │ │
│ └─────────────────────┘ │
│ ┌─────────────────────┐ │
│ │ 事件:OrderPlaced │ │
│ └─────────────────────┘ │
│ ┌─────────────────────┐ │
│ │ 视图:订单摘要 │
│ └─────────────────────┘ │
└─────────────────────────────┘
每个切片可独立实施和测试。
蓝图(实施指南)
事件模型成为实施蓝图:
1. 命令 → API端点 / 用户界面组件
2. 事件 → 事件存储模式
3. 读模型 → 数据库表 / 视图
4. 自动化 → 事件处理器 / 政策
每个切片直接映射到代码。
工作流
创建事件模型时:
- 定义范围:我们建模什么流程?
- 脑力激荡事件:列出所有状态变化
- 安排时间线:按时间顺序排列事件
- 添加命令:什么触发每个事件?
- 添加读模型:什么数据支持每个命令?
- 识别自动化:什么自动发生?
- 与利益相关者验证:这匹配现实吗?
- 定义切片:分组为可实施特性
用户界面
当用户直接调用时,此技能为业务过程创建事件模型。
执行工作流
- 解析参数 - 提取流程名称、深度级别(概览/标准/详细)和输出格式(ascii/mermaid/两者)。如果未提供流程,询问用户。
- 研究上下文 - 使用MCP服务器理解此类过程的常见模式。
- 创建事件模型 - 遵循5步过程:脑力激荡事件、安排时间线、添加命令(蓝色泳道)、添加读模型(绿色泳道)、识别自动化。
- 定义切片 - 分组为可实施的垂直切片,带给定/当/时规范。
- 生成输出 - 产生视觉图、命令表、事件表、读模型表、自动化和实施切片。
参考资料
详细指导:
最后更新: 2025-12-26