Перейти к основному содержимому

Моментальные снимки агрегатов в Axon

· 5 мин. чтения

1. Обзор

В этой статье мы рассмотрим, как Axon поддерживает сводные моментальные снимки.

Мы считаем эту статью расширением нашего основного руководства по Axon . Таким образом, мы снова будем использовать и Axon Framework , и Axon Server . В реализации этой статьи мы будем использовать первое, а второе — хранилище событий и маршрутизатор сообщений.

2. Агрегированные снэпшоты

Давайте начнем с понимания того, что означает моментальный снимок агрегата. Когда мы начинаем с Event Sourcing в приложении, возникает естественный вопрос: как мне сохранить совокупную производительность в моем приложении? Хотя существует несколько вариантов оптимизации, самый простой из них — внедрить моментальные снимки.

Агрегированные моментальные снимки — это процесс сохранения моментального снимка агрегатного состояния для улучшения загрузки . При включении моментальных снимков загрузка агрегата перед обработкой команды становится двухэтапным процессом:

  1. Получите самый последний моментальный снимок, если он есть, и используйте его для получения сводной информации. Моментальный снимок содержит порядковый номер, определяющий, до какой точки он представляет состояние агрегата.
  2. Извлеките оставшуюся часть событий, начиная с последовательности моментального снимка, и создайте остальную часть совокупности.

Если создание моментальных снимков должно быть включено, требуется процесс, запускающий создание моментальных снимков. Процесс создания моментального снимка должен обеспечивать сходство моментального снимка со всем агрегатным состоянием в момент его создания. Наконец, механизм совокупной загрузки (читай: репозиторий) должен сначала загрузить моментальный снимок, а затем любые оставшиеся события.

3. Агрегированные моментальные снимки в Axon

Axon Framework поддерживает моментальные снимки агрегатов. Полный обзор этого процесса см. в этом разделе справочного руководства Axon.

В рамках процесса создания моментальных снимков состоит из двух основных компонентов:

Snapshotter — это компонент, который создает моментальный снимок для агрегатного экземпляра. По умолчанию платформа будет использовать в качестве моментального снимка состояние всего агрегата.

SnapshotTriggerDefinition определяет триггер по отношению к Snapshotter для создания моментального снимка . Триггер может быть: ``

  • после определенного количества событий или
  • раз загрузка занимает определенное количество, или
  • в заданные моменты времени.

Хранение и извлечение моментальных снимков осуществляется в хранилище событий и в репозитории агрегата. С этой целью в хранилище событий есть отдельный раздел для хранения моментальных снимков. В Axon Server этот раздел отображается в отдельном файле снэпшотов.

Загрузка снэпшотов выполняется репозиторием, обращаясь для этого к хранилищу событий. Таким образом, загрузка агрегата и включение моментального снимка полностью выполняются фреймворком.

4. Настройка моментальных снимков

Мы рассмотрим домен Order, представленный в предыдущей статье. О построении, хранении и загрузке моментальных снимков уже заботятся Snapshotter , хранилище событий и репозиторий.

Следовательно, чтобы внедрить моментальные снимки в OrderAggregate , нам нужно только настроить SnapshotTriggerDefinition .

4.1. Определение триггера моментального снимка

Поскольку приложение использует Spring, мы можем добавить SnapshotTriggerDefinition в контекст приложения. С этой целью мы добавляем класс конфигурации :

@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 . Это определение инициирует создание моментального снимка, когда количество событий для агрегата соответствует «порогу». Обратите внимание, что порог настраивается через свойство.

Для определения также требуется Snapshotter , который Axon автоматически добавляет в контекст приложения. Следовательно, его можно подключить как параметр при построении определения триггера.

Другая реализация, которую мы могли бы использовать, это AggregateLoadTimeSnapshotTriggerDefinition . Это определение инициирует создание моментального снимка, если загрузка агрегата превышает loadTimeMillisThreshold. Наконец, поскольку это триггер моментального снимка, для создания моментального снимка также требуется Snapshotter .

4.2. Использование триггера моментального снимка

Теперь, когда SnapshotTriggerDefinition является частью приложения, нам нужно установить его для OrderAggregate . Аннотация Axon Aggregate позволяет нам указать имя компонента триггера моментального снимка.

Установка имени компонента в аннотации автоматически настроит определение триггера для агрегата:

@Aggregate(snapshotTriggerDefinition = "orderAggregateSnapshotTriggerDefinition")
public class OrderAggregate {
    // state, command handlers and event sourcing handlers omitted
}

Установив snapshotTriggerDefinition равным имени bean-компонента созданного определения, мы указываем платформе настроить его для этого агрегата.

5. Снэпшоты в действии

Конфигурация устанавливает порог определения триггера равным «250». Этот параметр означает , что платформа создает моментальный снимок после публикации 250 событий . Хотя это разумное значение по умолчанию для большинства приложений, это продлевает наш тест.

Итак, чтобы выполнить тест, мы настроим свойство axon.aggregate.order.snapshot-threshold на «5». Теперь нам проще проверить, работает ли моментальный снимок.

Для этого запускаем Axon Server и приложение Order. После выдачи достаточного количества команд для OrderAggregate для генерации пяти событий мы можем проверить, сохранило ли приложение моментальный снимок, выполнив поиск на панели инструментов Axon Server.

Для поиска снимков нам нужно нажать кнопку «Поиск» на левой вкладке, выбрать «Снимки» в верхнем левом углу и нажать оранжевую кнопку «Поиск» справа. В приведенной ниже таблице должна быть показана одна такая запись:

./2e42301838c13d960accac85de3ec145.jpg

6. Заключение

В этой статье мы рассмотрели, что такое совокупный снэпшот и как Axon Framework поддерживает эту концепцию.

Единственное, что требуется для включения моментальных снимков, — это конфигурация SnapshotTriggerDefinition на агрегате. Мы берем на себя всю работу по созданию, хранению и извлечению моментальных снимков.

Вы можете найти реализацию приложения Order и фрагменты кода на GitHub . Если у вас возникнут дополнительные вопросы по этой теме, также посетите страницу «Обсудить AxonIQ» .