mcpField
D
ddd-event-driven

ddd-event-driven

github.com/partme-ai开发71680 次安装3 周前更新
代码仓库

关于 ddd-event-driven

用于设计事件驱动系统的技能,涵盖领域事件、事件溯源、CQRS 和可靠投递模式。面向需要在聚合与服务间选择并实现事件流的开发者,包括消息代理传输和基于 outbox 的发布。

主要功能

  1. 01识别并建模领域事件
  2. 02设计事件发布与消费流程
  3. 03应用事件溯源和 CQRS 模式
  4. 04使用 Kafka 或 RabbitMQ 等代理
  5. 05通过 outbox 和幂等性提升投递可靠性

适用场景

  1. 01用事件解耦聚合与服务
  2. 02从事件流推导应用状态
  3. 03在数据库变更旁可靠发布事件
  4. 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 模式确保事件可靠投递

如何使用此技能

工作流
  1. 识别领域事件,这些事件表示聚合内“已经发生的事实”
  2. 设计事件流:发布、传输(消息总线)和消费
  3. 选择模式:简单领域事件、事件溯源或完整的 CQRS
  4. 实现投递保证:至少一次投递,并使用幂等消费者
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 表并通过轮询实现可靠发布
  • 制定明确的事件版本管理和兼容性策略(新增字段、新主题)
  • 先从简单领域事件入手,再采用完整的事件溯源;必须证明其复杂性权衡是合理的

资源

关键词

事件驱动架构、领域事件、事件溯源、CQRS、outbox 模式、消息代理、Kafka、RabbitMQ、最终一致性、幂等消费者

评论

支持 Markdown