1. 概述

本文将深入探讨Axon框架如何支持聚合快照(Aggregate Snapshotting)。这是对Axon核心指南的重要扩展,我们将继续使用Axon Framework进行实现,并依赖Axon Server作为事件存储和消息路由器。


2. 聚合快照机制

什么是聚合快照?

当应用采用事件溯源(Event Sourcing)时,一个关键问题是:如何保证加载聚合的性能? 虽然有多种优化方案,最直接有效的就是引入快照机制

核心原理:聚合快照通过定期存储聚合的状态快照来加速加载。启用快照后,聚合加载变为两步操作:

  1. 加载快照:获取最新的快照(若有),用其初始化聚合状态。快照携带序列号,标记其覆盖的事件范围。
  2. 补充事件:从快照序列号之后继续加载剩余事件,完成状态重建。

关键组件

  • 快照创建触发器:需配置触发条件(如事件计数阈值)
  • 状态一致性保证:快照必须完整反映创建时刻的聚合状态
  • 仓储(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 验证步骤

  1. 启动Axon Server和订单应用
  2. 对同一OrderAggregate发送5条命令(生成5个事件)
  3. 在Axon Server Dashboard验证快照:
    • 左侧导航栏点击"Search"
    • 左上角选择"Snapshots"
    • 点击橙色"Search"按钮
    • 结果表格应显示类似条目: Axon Server快照查询结果

6. 结论

核心价值:Axon将快照机制封装得极为优雅——开发者只需:

  1. 定义SnapshotTriggerDefinition触发策略
  2. 通过注解关联到聚合

框架职责:自动处理快照的创建、存储、加载及状态补充逻辑。这种设计让开发者能专注业务逻辑,无需关心底层实现细节。

完整代码示例见:GitHub仓库
深度讨论可访问:AxonIQ社区


原始标题:Snapshotting Aggregates in Axon