4.9、领域事件
分类: DDD领域驱动设计实战
领域事件
领域事件是领域模型中发生的重要事件。使用领域事件可以实现事件驱动架构,提高系统的解耦性。本节将学习领域事件。
本节将学习:事件驱动架构、事件发布与订阅、事件存储,以及最终一致性。
事件驱动架构
架构特点
事件驱动架构的特点:
- 松耦合
- 可扩展
- 异步处理
事件流程
事件发布与订阅
事件定义
public class OrderCreatedEvent { private final Long orderId; private final Long userId; private final BigDecimal totalAmount; private final LocalDateTime occurredOn; public OrderCreatedEvent(Long orderId, Long userId, BigDecimal totalAmount) { this.orderId = orderId; this.userId = userId; this.totalAmount = totalAmount; this.occurredOn = LocalDateTime.now(); } }
事件发布
public class Order { private List<DomainEvent> domainEvents = new ArrayList<>(); public void create() { // 创建订单逻辑 this.domainEvents.add(new OrderCreatedEvent(this.id, this.userId, this.totalAmount)); } public List<DomainEvent> getDomainEvents() { return domainEvents; } public void clearDomainEvents() { domainEvents.clear(); } }
事件订阅
@Component public class OrderCreatedEventHandler { @EventListener public void handle(OrderCreatedEvent event) { // 处理订单创建事件 // 例如:发送通知、更新库存等 } }
事件存储
事件存储实现
@Entity public class DomainEventRecord { @Id private Long id; private String eventType; private String eventData; private LocalDateTime occurredOn; private String aggregateId; private String aggregateType; }
最终一致性
一致性保证
领域事件实现最终一致性:
- 发布事件后立即返回
- 事件处理异步执行
- 通过重试保证最终一致性
官方资源
- DDD 领域事件:https://www.domainlanguage.com/ddd/
本节小结
在本节中,我们学习了:
第一个是事件驱动架构。 使用事件实现松耦合架构。
第二个是事件发布与订阅。 发布和订阅领域事件。
第三个是事件存储。 持久化领域事件。
第四个是最终一致性。 通过事件实现最终一致性。
这就是领域事件。领域事件是实现事件驱动架构的重要手段。
在下一节,我们将学习完整的 Domain 实现示例。