Аксон - проекция или событие обогащают? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть следующие настройки:

  1. HTTP-запрос приходит на конечную точку REST, и я получаю его в моей службе приложений.
  2. Служба приложений сопоставляет запрос с командой C1 и пересылает его для агрегированияиспользуя commandGateway.sendAndWait(new C1(restPostBody));.
  3. Агрегат загружается из репозитория, применяется новая команда и создается новое событие, сохраняемое в хранилище.
  4. На данный момент мне нужно обогатить это событие ииспользуйте его как ответ на вызов REST.

До сих пор я мог видеть следующие параметры:

  1. Использовать проектор вида и проектировать новое событие для создания модели вида, котораяможет быть перенаправлен как ответ в вызове REST.Я догадываюсь, что мне нужно будет использовать queryGateway.subscriptionQuery(... и sqr.updates().blockFirst() для ожидания обработки события проектором, а затем для создания ответа.Кроме того, я предполагаю, что это должно быть синхронно, поскольку проекция может выйти из синхронизации, если произойдет сбой системы между сохранением события в БД и сохранением проекции в БД?

  2. Использовать некоторое обогащение события после публикации событияот агрегата и добавить необходимые свойства к нему и добавить ответ на вызов REST.Это похоже на Projection, но в этом случае я не буду сохранять его в БД, поскольку данные требуются только в тот момент, когда выполняется ответ на конечную точку REST во время выдачи команды.Это должно быть совершенно синхронно, так как если что-то не получится, я потеряю ответ.В случае асинхронности - мне нужно было бы, чтобы Aggregate обрабатывал дублирующиеся события и по-прежнему отправлял события в обогащенное событие, но без сохранения в db.Это, кажется, усложняет ситуацию.

Есть ли какие-либо рекомендации, связанные с этим?

ОБНОВЛЕНИЕ

чтоВ настоящее время у меня есть:

@Autowired
    public void configure(EventProcessingConfigurer configurer){
        configurer.usingSubscribingEventProcessors();
    }

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

try {
            sc = queryGateway.query(new MyQuery("123", "123),
                    ResponseTypes.instanceOf(SomeView.class)).get();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        catch (ExecutionException e) {
            e.printStackTrace();
        }

И я могу вернуть это SomeView как ответ на API REST.

1 Ответ

0 голосов
/ 05 марта 2019

Итак, @ bojanv55, вы пытаетесь подделать ваше приложение для синхронной настройки, в то время как подход команда-событие-запрос в Axon Framework заставляет вас идти другим путем.

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

Однако, это легче сказать, чем сделать;Вы задаете этот вопрос с причиной, конечно.Мне лично нравится использование запроса на подписку, на который вы также указываете, чтобы подделать операцию, чтобы стать синхронной.

Этот репозиторий от Франса показывает, как это сделать с помощью Axon Frameworkдовольно хорошо, я думаю.

Он обрабатывает операцию REST и сначала отправляет запрос на подписку на то, что, как вы знаете, скоро будет обновлено.Во-вторых, команда отправляется агрегату, агрегат принимает решение опубликовать событие, а событие обновляет модель запроса.Обновление модели запроса представляет собой обновление, отправляемое по запросу вашей подписки, позволяющее вам возвращать результат только после того, как модель запроса действительно будет настроена.

В заключение, я всегда рекомендую свое первое предложениечтобы принять асинхронную ситуацию, в которой вы находитесь. Во-вторых, я думаю, что решение по подписке, которое я только что поделился, могло бы решить и вашу проблему.

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

...