Есть ли способ воспроизвести события в диапазоне дат?

Я реализую пример пружинного ботинка и аксона. У меня есть два события (пополнение и снятие остатка на счете). Я хочу знать, есть ли способ узнать состояние агрегата учетной записи на заданную дату? Я хочу получить не только окончательное состояние, но и воспроизвести события в диапазоне дат.


person Safe    schedule 10.05.2019    source источник


Ответы (1)


Думаю, я могу помочь с этим.

В контексте Axon Framework вы можете начать воспроизведение событий, сказав данному TrackingEventProcessor «сбросить» его токены. Кстати, текущее описание этого в Справочном руководстве можно найти здесь.

Эти TrackingTokens - объекты, которые знают, насколько далеко данный TrackingEventProcessor с точки зрения обработки событий из потока событий. Таким образом, сброс / настройка этих TrackingTokens - это то, что вызовет воспроизведение событий.

Зная все это, второй шаг - взглянуть на методы, которые TrackingEventProcessor предоставляет для «сброса токенов», которые делятся на три части:

  1. TrackingEventProcessor#resetTokens()
  2. TrackingEventProcessor#resetTokens(Function<StreamableMessageSource, TrackingToken>)
  3. TrackingEventProcessor#resetTokens(TrackingToken)

Первый вариант сбросит ваши токены в начало потока событий, который, таким образом, воспроизведет все. Однако варианты два и три дают вам возможность предоставить TrackingToken.

Таким образом, вы можете указать TrackingToken, начиная с нескольких точек в потоке событий. Итак, как вы подойдете к созданию такого TrackingToken в определенный момент времени? Для этого вам следует взглянуть на интерфейс StreamableMessageSource, который выполняет следующие операции:

  1. StreamableMessageSource#createTailToken()
  2. StreamableMessageSource#createHeadToken()
  3. StreamableMessageSource#createTokenAt(Instant)
  4. StreamableMessageSource#createTokenSince(Duration)

Вариант 1 - это то, что используется для создания токена в начале потока, а вариант 2 создает токен в начале потока.

Однако варианты 3 и 4 позволят вам создать токен в определенный момент времени, что позволит вам воспроизвести все события с момента определенного экземпляра до настоящего времени.

Однако в этом сценарии есть одна оговорка. Вы просите переиграть агрегат. С точки зрения Axon по умолчанию Aggregate - это модель команд в CQRS, настроенная, таким образом, имея дело с командами, поступающими в вашу систему. В большинстве приложений вы хотите, чтобы команды (например, запросы на изменение чего-либо) выполнялись в текущем состоянии приложения. Таким образом, Repository, предоставленный для получения Агрегата, не позволяет указать момент времени.

Таким образом, описанное выше решение в отношении воспроизведения связано исключительно с созданием модели запроса, поскольку TrackingEventProcessor является частью стороны обработки событий в вашем приложении, наиболее часто используемой для создания представлений. Эта идея также связана с вашими вопросами о том, что вы хотите знать «состояние агрегированной учетной записи» в данный момент времени. Это не команда, а запрос, поскольку у вас есть «запрос данных» вместо «запрос на изменение состояния».

Надеюсь, это поможет вам @Safe!

person Steven    schedule 10.05.2019