Несколько саг (одного типа) в разных JVM с использованием Axon - PullRequest
1 голос
/ 11 января 2020

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

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

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

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

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


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

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


Et c. Еще много вопросов.

1 Ответ

2 голосов
/ 13 января 2020

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

Обработчики событий выпускаются в двух вариантах:

  1. SubscribingEventProcessor
  2. TrackingEventProcessor

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

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

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

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

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

...