首页/开发/系统分析与架构设计速查/事件溯源(Event Sourcing)
架构风格与模式58 条

事件溯源(Event Sourcing)

以事件序列作为状态的事实来源,当前状态由事件重放得到;配合快照控制重放成本,事件需版本化并可兼容演进。

事件溯源是什么

事件溯源以事件序列作为状态的事实来源:系统只追加记录发生了什么,当前状态由事件按顺序重放得到。它带来完整的审计轨迹、可重建任意时点状态的能力,以及天然与事件驱动架构契合的优势;代价是查询需要投影或读模型、事件成为不可随意修改的契约、重放成本需要快照控制。它适合以状态变更为核心、追溯价值高的领域,如账务与订单。

基本信息

存储只追加的事件日志(append-only),不支持就地更新
快照定期保存聚合状态,缩短重建时间
收益完整审计轨迹、可重建任意时点状态、天然支持事件驱动
约束事件不可变,历史事件的语义只能通过版本化与迁移演进
配套读取侧使用投影或读模型,配合 CQRS 组织查询

工程要点

主题做法
快照每 N 个事件或按体积触发,控制重建时长
版本化事件 schema 带版本字段,升级后仍可读旧事件
读侧查询走投影或读模型,不扫描事件流
归档冷事件转储到对象存储,保留回放能力
并发按聚合标识串行写,用期望版本号做乐观并发控制
隐私个人数据需加密或单独存储,避免永久留存敏感信息

典型使用场景

  • 账务与流水:每一笔变动都有据可查,支持任意时点回溯
  • 订单生命周期:完整保留状态变更轨迹,便于纠纷处理
  • 规则频繁调整的业务:按新规则重放历史事件即可重算
  • 审计合规场景:监管要求可解释的数据变更过程
  • 与事件驱动集成:写侧产生事件,读侧与下游订阅消费
  • 调试与复盘:按事件顺序复现线上问题发生过程
事件溯源不等于必须全量存储:快照加增量事件的组合是常见做法,既能快速重建聚合,也保留完整历史。
事件一旦发布即成为契约;修改历史事件语义需要版本化与迁移策略,直接改写旧数据会破坏所有派生状态的可信度。

易错点

  • 把事件当可变记录修改,派生的读模型与快照失去可信来源
  • 不做快照,聚合事件数上千后每次加载都全量重放,接口延迟不可接受
  • 用事件流直接支撑列表与统计查询,缺少投影导致查询性能极差
  • 事件携带完整内部结构,schema 一变就影响所有消费者
  • 未做乐观并发控制,同一聚合被并发写入产生冲突事件

数据来源与参考

  • Martin Fowler bliki《Event Sourcing》
  • Greg Young 相关文献
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌