← 返回首页
🎯

Event Storming建模

📂 architecture ⏱ 2 min 306 words

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 不仅是建模技术,更是团队理解和沟通业务的工具。