用途
Event Sourcing 用于实现事件溯源与 CQRS 模式。其核心思想是把状态变化存储为一系列事件,而不是仅保存当前状态,从而支持时间点查询(temporal queries)、审计追踪(audit trails)和事件重放(event replay)。
适用场景
资料列出的适用场景包括:
- 审计追踪需求
- 时间点查询(查询任意时间点的状态)
- 事件驱动微服务
- CQRS 实现
- 金融系统
- 复杂领域模型
- 调试与分析
- 合规与监管
主要能力
资料中的参考指南(references/ 目录)包含以下详细实现:
- Event Store(TypeScript)
- Projections(Read Models,读模型)
- Event Store with PostgreSQL
- Snapshots for Performance(性能快照)
使用方式
资料提供了一个最小可运行示例,包含 DomainEvent 接口、Aggregate 接口以及 EventStore 类的骨架。示例中 EventStore 通过 appendEvents 方法追加事件,并接收 aggregateId、expectedVersion 和事件列表等参数。完整实现需参见参考指南。
示例代码结构如下:
interface DomainEvent {
id: string;
aggregateId: string;
aggregateType: string;
eventType: string;
data: any;
metadata: {
userId?: string;
timestamp: number;
version: number;
};
}
interface Aggregate {
id: string;
version: number;
}
class EventStore {
private events: DomainEvent[] = [];
async appendEvents(
aggregateId: string,
expectedVersion: number,
events: Omit<DomainEvent, "id" | "metadata">[],
// ... (see reference guides for full implementation)
最佳实践
资料给出的建议分为应做与不应做两类。
应做(DO):
- 以不可变方式存储事件
- 对事件进行版本化
- 使用乐观并发控制
- 为性能创建快照
- 使用投影处理查询
- 保持事件小而聚焦
- 包含元数据(时间戳、用户等)
- 处理事件版本化与迁移
不应做(DON'T):
- 修改过去的事件
- 只存储当前状态
- 跳过并发检查
- 用事件存储处理读取查询
- 让事件过于庞大
- 忽略事件模式的演进
限制
资料未提供关于收费、价格、平台支持范围或具体性能指标的信息。完整实现细节需参考资料中提到的 references/ 目录下的参考指南。