1. 概述
本文将深入探讨Axon框架如何支持聚合快照(Aggregate Snapshotting)。这是对Axon核心指南的重要扩展,我们将继续使用Axon Framework进行实现,并依赖Axon Server作为事件存储和消息路由器。
2. 聚合快照机制
什么是聚合快照?
当应用采用事件溯源(Event Sourcing)时,一个关键问题是:如何保证加载聚合的性能? 虽然有多种优化方案,最直接有效的就是引入快照机制。
核心原理:聚合快照通过定期存储聚合的状态快照来加速加载。启用快照后,聚合加载变为两步操作:
- 加载快照:获取最新的快照(若有),用其初始化聚合状态。快照携带序列号,标记其覆盖的事件范围。
- 补充事件:从快照序列号之后继续加载剩余事件,完成状态重建。
关键组件
- 快照创建触发器:需配置触发条件(如事件计数阈值)
- 状态一致性保证:快照必须完整反映创建时刻的聚合状态
- 仓储(Repository)协作:框架自动处理快照加载与事件补充逻辑
3. Axon中的快照实现
Axon框架内置了完整的快照支持,核心由两大组件驱动:
3.1 核心组件
组件 | 职责 |
---|---|
Snapshotter | 负责构建聚合实例的快照(默认使用完整状态) |
SnapshotTriggerDefinition | 定义快照创建触发条件 |
3.2 触发策略
触发条件支持三种模式:
- 事件计数:当事件数量达到阈值时触发(最常用)
- 加载耗时:当聚合加载时间超过阈值时触发
- 定时触发:在指定时间点触发
3.3 存储与加载
- 存储层:事件存储(如Axon Server)提供独立快照存储区
- 加载流程:仓储自动协调快照加载和事件补充
踩坑提示:框架已处理所有底层逻辑,开发者只需关注触发条件配置!
4. 快照配置实战
以订单领域(Order Domain)为例,展示如何为OrderAggregate
启用快照。框架已内置快照的创建/存储/加载机制,我们只需配置触发器。
4.1 定义快照触发器
通过Spring配置类声明触发器:
@Configuration
public class OrderApplicationConfiguration {
@Bean
public SnapshotTriggerDefinition orderAggregateSnapshotTriggerDefinition(
Snapshotter snapshotter,
@Value("${axon.aggregate.order.snapshot-threshold:250}") int threshold) {
return new EventCountSnapshotTriggerDefinition(snapshotter, threshold);
}
}
关键点:
- 使用
EventCountSnapshotTriggerDefinition
实现事件计数触发 - 阈值通过
axon.aggregate.order.snapshot-threshold
属性可配置 Snapshotter
由框架自动注入
4.2 应用触发器
在聚合类上通过@Aggregate
注解指定触发器Bean名称:
@Aggregate(snapshotTriggerDefinition = "orderAggregateSnapshotTriggerDefinition")
public class OrderAggregate {
// 聚合状态、命令处理器、事件溯源处理器省略
}
简单粗暴:只要注解属性值与触发器Bean名称一致,框架自动完成配置!
5. 快照效果验证
5.1 测试准备
默认阈值250对测试不友好,临时调整为5:
axon.aggregate.order.snapshot-threshold=5
5.2 验证步骤
- 启动Axon Server和订单应用
- 对同一
OrderAggregate
发送5条命令(生成5个事件) - 在Axon Server Dashboard验证快照:
- 左侧导航栏点击"Search"
- 左上角选择"Snapshots"
- 点击橙色"Search"按钮
- 结果表格应显示类似条目:
6. 结论
核心价值:Axon将快照机制封装得极为优雅——开发者只需:
- 定义
SnapshotTriggerDefinition
触发策略 - 通过注解关联到聚合
框架职责:自动处理快照的创建、存储、加载及状态补充逻辑。这种设计让开发者能专注业务逻辑,无需关心底层实现细节。