关于 ddd-event-driven
用于设计事件驱动系统的技能,涵盖领域事件、事件溯源、CQRS 和可靠投递模式。面向需要在聚合与服务间选择并实现事件流的开发者,包括消息代理传输和基于 outbox 的发布。
主要功能
- 01识别并建模领域事件
- 02设计事件发布与消费流程
- 03应用事件溯源和 CQRS 模式
- 04使用 Kafka 或 RabbitMQ 等代理
- 05通过 outbox 和幂等性提升投递可靠性
适用场景
- 01用事件解耦聚合与服务
- 02从事件流推导应用状态
- 03在数据库变更旁可靠发布事件
- 04规划命令端与读取模型分离
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ partme-ai/ full-stack-skills --skill ddd-event-driven安装后在 Claude Code 中输入/ddd-event-driven确认已加载。
附带文件LICENSE.txt
详细介绍
使用此技能的时机
当用户想要执行以下操作时,请使用此技能:
- 使用领域事件解耦聚合和服务
- 设计状态由事件流推导而来的事件溯源系统
- 实现 CQRS(命令查询职责分离)
- 选择并集成消息代理(Kafka、RabbitMQ 等)
- 使用 outbox 模式确保事件可靠投递
如何使用此技能
工作流
- 识别领域事件,这些事件表示聚合内“已经发生的事实”
- 设计事件流:发布、传输(消息总线)和消费
- 选择模式:简单领域事件、事件溯源或完整的 CQRS
- 实现投递保证:至少一次投递,并使用幂等消费者
1. 领域事件定义
public record OrderPlacedEvent(
String orderId,
String customerId,
BigDecimal totalAmount,
Instant occurredAt
) implements DomainEvent {}
2. 发布领域事件
public class Order extends AggregateRoot {
public void place(List<OrderItem> items) {
// Business logic...
this.status = OrderStatus.PLACED;
registerEvent(new OrderPlacedEvent(this.id, this.customerId, this.total, Instant.now()));
}
}
3. 事件溯源模式
public class Account {
private BigDecimal balance = BigDecimal.ZERO;
private final List<DomainEvent> changes = new ArrayList<>();
public void apply(MoneyDepositedEvent event) {
this.balance = this.balance.add(event.amount());
}
public static Account reconstitute(List<DomainEvent> events) {
Account account = new Account();
events.forEach(account::apply);
return account;
}
}
4. CQRS 概览
Write Side: Read Side:
Command → Aggregate → Events → Event Handler → Read Model (View)
(message bus)
5. 用于可靠投递的 Outbox 模式
// Save event to outbox table in the same transaction as the aggregate
@Transactional
public void placeOrder(PlaceOrderCommand cmd) {
Order order = Order.place(cmd);
orderRepository.save(order);
outboxRepository.save(new OutboxEntry("OrderPlaced", serialize(order.events())));
}
// A separate poller publishes outbox entries to the message broker
最佳实践
- 使用过去时态命名事件;仅包含聚合 ID 和必要数据——避免大型负载或敏感信息
- 通过幂等消费者保证至少一次投递;使用 outbox 表并通过轮询实现可靠发布
- 制定明确的事件版本管理和兼容性策略(新增字段、新主题)
- 先从简单领域事件入手,再采用完整的事件溯源;必须证明其复杂性权衡是合理的
资源
- Eric Evans 著《领域驱动设计》
- Martin Fowler 关于事件溯源的文章:https://martinfowler.com/eaaDev/EventSourcing.html
- CQRS:https://martinfowler.com/bliki/CQRS.html
关键词
事件驱动架构、领域事件、事件溯源、CQRS、outbox 模式、消息代理、Kafka、RabbitMQ、最终一致性、幂等消费者
评论
支持 Markdown