Несколько саг (одного типа) в разных JVM с использованием Axon

Как на самом деле управлять сагами с несколькими запущенными JVM одного и того же приложения

Должна ли каждая JVM этого приложения использовать одну и ту же базу данных? В противном случае токены отслеживания не будут «совместно использоваться» в одном приложении?

Как события распределяются между одним и тем же приложением, работающим для саг? Всегда ли один тип саги или экземпляр саги обрабатывается в одном и том же приложении (пока оно не будет отключено, чтобы за него взялся другой экземпляр)?

Или каждая JVM получает события и запускается каждая сага того же типа? (и приводят к отправке дублирующих команд и ошибок)

Есть еще что-нибудь, о чем нужно заботиться?


Пример сценария: 3 одинаковых приложения на 3 разных ПК / ВМ. Сага под названием «SagaA», которая может начинаться с EventA и заканчиваться EventB. Оба события имеют поле «id», у saga есть 2 обработчика событий для обработки событий в саге.

Как будут обрабатываться события, например 3 события EventA и EventB, каждое с идентификатором разного значения


И т.д. Еще много вопросов.


person Yoann CAPLAIN    schedule 11.01.2020    source источник


Ответы (1)


Сага в терминах Axon - это не что иное, как особый тип обработчика событий. Таким образом, Axon будет использовать обработчик событий для передачи событий экземпляру Saga.

Процессоры событий бывают двух видов:

  1. SubscribingEventProcessor
  2. TrackingEventProcessor

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

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

Вместо этого настоятельно рекомендуется использовать TrackingEventProcessor в качестве источника событий для конкретного экземпляра саги. При этом любое распределение нагрузки следует из требования, что TrackingToken должен быть заявлен таким процессором, чтобы иметь возможность выполнять любую работу (также называемую обработкой событий). Таким образом, чтобы разделить рабочую нагрузку по предоставлению событий из хранилища событий вашим экземплярам Saga в Axon, вам нужно будет сделать следующее:

  1. Настройте TrackingEventProcessor для указанного типа саги
  2. Настройте TokenStore, в котором базовый механизм хранения является общим среди всех экземпляров приложения.
  3. [Необязательно] Если вы хотите параллельную обработку потока событий, вам нужно будет сегментировать TrackingToken для данного типа саги. [РЕДАКТИРОВАТЬ]. Кроме того, таблица saga_entry, используемая SagaStore, должна также использоваться всеми экземплярами приложения, выполняющими данный тип саги.

Надеюсь, этого ответа хватит на «еще много вопросов», которые у вас есть @Yoann!

person Steven    schedule 13.01.2020
comment
Спасибо. Одно пояснение к 3. части: если мы распараллеливаем обработку, означает ли это, что один и тот же тип саги и экземпляр могут быть загружены в разные JVM? Означает ли это, что, как и tokenStore, нам нужно совместно использовать SagaStore среди одних и тех же приложений? - person Yoann CAPLAIN; 13.01.2020
comment
Это предположение верно @YoannCAPLAIN, в этом случае также необходимо предоставить общий доступ к базе данных, используемой для хранения ваших саг. Я обновлю свой ответ соответствующим образом для ясности. - person Steven; 14.01.2020