Event Storming建模
Event Storming建模
Event Storming 概述
Event Storming 是 Alberto Brandolini 发明的协作式建模技术。通过在白板上用便签纸表示领域事件,团队可以快速发现业务流程和领域模型。
Event Storming 便签颜色约定:
🟧 橙色:领域事件(Domain Event)
"订单已创建"、"支付已完成"、"库存已扣减"
🟦 蓝色:命令(Command)
"创建订单"、"确认支付"、"扣减库存"
🟨 黄色:聚合(Aggregate)
"订单"、"支付单"、"库存"
🟪 紫色:策略(Policy)
"当订单创建时,检查库存"
🟥 红色:问题(Problem)
"库存不足时如何处理?"
🟩 绿色:读模型(Read Model)
"订单列表"、"库存查询"
Event Storming 流程
Step 1: 头脑风暴领域事件
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 订单已 │ │ 支付已 │ │ 库存已 │ │ 发货已 │ │ 订单已 │
│ 创建 │ │ 完成 │ │ 扣减 │ │ 完成 │ │ 完成 │
└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘
Step 2: 识别触发事件的命令
┌─────────┐
│ 创建订单 │
└────┬────┘
▼
🟧 订单已创建
Step 3: 识别执行命令的聚合
┌───────┐
│ 订单 │ ← 聚合
└───┬───┘
│ 执行
▼
┌─────────┐
│创建订单 │ ← 命令
└────┬────┘
│ 产生
▼
🟧 订单已创建
Step 4: 识别策略(事件驱动的自动化)
🟧 订单已创建
│
▼
┌─────────────┐
│ 检查库存策略 │ ← 策略
└──────┬──────┘
│ 触发
▼
┌─────────┐
│扣减库存 │ ← 命令
└────┬────┘
│ 产生
▼
🟧 库存已扣减
从 Event Storming 到代码
// 从 Event Storming 发现的领域事件
@Value
public class OrderCreatedEvent {
private final OrderId orderId;
private final CustomerId customerId;
private final List<OrderItemDto> items;
private final LocalDateTime occurredAt;
}
// 从 Event Storming 发现的命令
@Value
public class CreateOrderCommand {
private final CustomerId customerId;
private final List<OrderItemDto> items;
}
// 从 Event Storming 发现的策略
@Component
public class OrderCreatedPolicy {
private final InventoryService inventoryService;
@EventListener
public void handle(OrderCreatedEvent event) {
// 策略:当订单创建时,检查并预留库存
for (OrderItemDto item : event.getItems()) {
inventoryService.reserve(
item.getProductId(),
item.getQuantity()
);
}
}
}
// 从 Event Storming 发现的聚合
@Entity
public class Order {
@Id
private OrderId id;
private CustomerId customerId;
@OneToMany(cascade = CascadeType.ALL)
private List<OrderItem> items;
private OrderStatus status;
// 命令处理方法
public static Order create(CustomerId customerId, List<OrderItem> items) {
Order order = new Order();
order.id = OrderId.generate();
order.customerId = customerId;
order.items = new ArrayList<>(items);
order.status = OrderStatus.CREATED;
// 产生领域事件
order.registerEvent(new OrderCreatedEvent(
order.id, order.customerId, items, LocalDateTime.now()
));
return order;
}
}
Event Storming 的价值
- 快速理解复杂业务:通过可视化事件流,团队可以快速把握业务全貌
- 发现隐藏的业务规则:在讨论过程中发现边界情况和异常流程
- 促进团队协作:业务专家和技术人员共同参与建模
- 自然产出领域模型:事件、命令、聚合直接对应代码结构
Event Storming 不仅是建模技术,更是团队理解和沟通业务的工具。