Аксон - Самый простой способ проецирования во время запроса - PullRequest
0 голосов
/ 27 мая 2019

Обычно у меня будет 5-6 событий на агрегат, и я не хотел бы хранить прогнозы в БД. Какой самый простой способ всегда создавать проекцию представления во время запроса?

1 Ответ

1 голос
/ 28 мая 2019

Короткий ответ на этот вопрос заключается в том, что нет простого / быстрого способа сделать это.

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

То, что я хотел бы предложить, существует в несколько шагов:

  1. Создайте модель запроса, которую вы хотите вернуть, которая может обрабатывать события (использовать @EventHandler аннотированные методы в модели)
  2. Создайте компонент, который может обрабатывать запрос, который будет возвращать модель запроса на первом этапе (для этого используйте аннотированный метод @QueryHandler.
  3. Компонент Query-Handling-Component должен иметь возможность извлекать поток событий из EventStore. Если это основано на aggregateIdentifier, используйте метод EventStore#readEvents(String). Если вам нужен весь поток событий, вам нужно использовать метод StreamableMessageSource#openStream(TrackingToken) (примечание: интерфейс EventStore реализует StreamableMessageSource)
  4. После обработки запроса создайте AnnotationEventHandlerAdapter, предоставив ему свежий экземпляр вашей модели запроса
  5. Для каждого события в потоке событий, которое вы создали в точке 3, вызовите метод AnnotationEventHandlerAdapter#handle(EventMessage). Этот метод вызовет аннотированные методы @EventHandler для вашего объекта Query Model
  6. Если поток исчерпан, вам гарантированы все необходимые события для вашей модели запроса. Таким образом, теперь вы можете вернуть модель запроса

Итак, опять же, я не думаю, что это слишком тривиально, легко или быстро настроить. Кроме того, на шаге 3 есть несколько оговорок. Извлечение потока заданного Агрегата на основе Идентификатора Агрегата является довольно быстрым / кратким, поскольку Агрегат в общем случае не имеет большого количества событий.

Однако, получение потока событий на основе TrackingToken, который вам понадобится, если ваша модель запроса охватывает несколько агрегатов, может гарантировать, что вы извлекаете хранилище событий whole для создания экземпляров ваших моделей на летать. Конечно, вы можете точно настроить момент времени, когда вы хотите, чтобы поток событий возвращал события, когда вы имеете дело с TrackingToken, но изменения довольно высоки, вы будете неполными и относительно медленными.

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

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

...