用途
Event Sourcing Design 是一个用于设计事件溯源(Event Sourcing)系统的技能。它围绕事件存储、投影和版本化模式,帮助开发者做出架构决策,并给出基于成熟事件溯源文献的指导。该技能强调“文档优先”的方法:在设计事件溯源之前,先调用文档管理技能获取事件溯源模式,并通过 MCP 服务器(perplexity、context7)验证模式。
主要能力
事件溯源基础
技能对比了传统状态存储与事件溯源两种方式:传统方式由应用直接写入数据库的当前状态;事件溯源则由应用写入事件存储(保存全部事件),再通过投影生成读取视图,并保留完整历史。
适用与不适用场景
适合事件溯源的场景包括:审计要求(需要完整历史、合规、法律证据)、复杂领域逻辑(业务规则演进、时间查询、“假设”分析)、高价值聚合(金融交易、医疗记录、法律文档)、协作场景(冲突解决、合并、离线同步)、事件驱动架构(微服务集成、异步处理、实时更新)。
可能不适合的场景包括:简单 CRUD、频繁更新(高速小变更、实时流数据、IoT 传感器数据)、大型聚合(每个聚合事件过多、性能与内存顾虑)、即席查询(复杂报表、未知查询模式、BI/分析为主)。
事件存储设计
技能给出事件结构示例(C# record,包含 EventId、EventType、AggregateId、AggregateType、Version、Timestamp、Payload、Metadata),并介绍流组织策略:按聚合(最常见,如 "Order-{orderId}")、按类别(如 "$ce-Order")、按关联(如 "Saga-{correlationId}")、全局流("$all")。同时提供 PostgreSQL 事件存储表结构,包含 events 表字段(event_id、stream_id、stream_position、global_position、event_type、payload、metadata、timestamp)及索引。
聚合设计与重水化
技能给出聚合基类示例(Apply、When、Load、GetUncommittedEvents、ClearUncommittedEvents)以及 Order 聚合示例。重水化模式步骤为:加载流、创建聚合、应用事件、执行命令、保存事件(使用乐观并发)。
投影模式
投影类型包括:实时投影(实时构建、订阅事件流、最终一致)、追赶投影(从历史重建、可随时运行、用于新读模型、批处理)、快照投影(周期性状态捕获、优化重水化)、内联投影(与写入同事务、强一致、扩展性有限)。技能给出 OrderSummaryProjection 的 C# 示例。
快照
何时快照:聚合事件多(100+)、重水化慢、读性能重要、事件追加密集。快照频率:每 N 个事件、按时间间隔、在重要状态变化时、按需(惰性)。不建议快照:聚合生命周期短、每个聚合事件少、很少全量重放。技能给出 Snapshot 记录结构与带快照的加载示例。
事件版本化
版本化策略包括:弱模式(推荐,添加可选字段,旧事件用默认值反序列化,前后兼容)、上转型(读取时转换旧事件为新格式,保留原始事件)、事件类型版本化(OrderPlacedV1、OrderPlacedV2,路由到相应处理器)、复制与转换(迁移整个流,一次性操作,有风险)。技能给出 IEventUpcaster 接口与 OrderPlacedV1ToV2Upcaster 示例。
设计决策矩阵
技能从审计追踪、复杂度、查询灵活性、时间查询、存储、调试、团队经验等维度对比事件溯源与状态存储。
使用方式
技能建议的工作流为:评估适用性、识别聚合(定义一致性边界)、设计事件(命名、结构、版本化策略)、选择事件存储(EventStoreDB、Marten、自定义)、规划投影(所需读模型)、考虑快照(性能优化)、制定版本策略(事件如何演进)、制定测试策略(基于事件的测试)。
适用场景
需要审计追踪、复杂领域逻辑、高价值聚合、协作或事件驱动架构的系统设计。
限制
技能本身为设计指导,不包含具体运行时实现;示例以 C# 与 PostgreSQL 为主。关于收费、价格、平台支持等具体信息暂未提供。