CQRS события между несколькими сервисами - PullRequest
0 голосов
/ 27 июня 2018

У нас есть микросервис, который прослушивает события, давайте пока назовем это AuditService. Он слушает события аудита (AuditEvent) на rabbitmq. Любой, кто хочет вызвать AuditService, должен создать и запустить AuditEvent. Мы поделились AuditEvent pojo в общем модуле, чтобы его можно было использовать совместно.

В AuditService есть прослушиватель событий, который прослушивает AuditEvent из очереди rabbitmq. Когда мы получаем сообщение, мы затем выполняем некоторую обработку / проверку для AuditEvent и затем сохраняем его в таблице базы данных AuditEntry.

Затем мы хотим опубликовать другое событие. Позволяет назвать это AuditPublishEvent. Таким образом, чтобы сделать это, мы создаем другую команду (AuditPublishCommand), которая в свою очередь запускает AuditPublishEvent. Это событие снова для очереди, и любая служба, публикующая AuditEvent, будет прослушивать его. Будет служба для отправки ее по электронной почте, а другая - для отправки в виде push-уведомлений и т. Д.

На данный момент мы делаем на AuditService

Listen for AuditEvent
  |
  v
Trigger AuditEvent event handler
  |
  v
Validate audit event and process it
  |
  v
Save it to the database
  |
  v
If save is successful then send AuditPublishEvent to queue via AuditPublishCommand

Обратите внимание, что последняя часть должна быть синхронной, то есть, если сохранение db не удалось, мы не хотим отправлять электронную почту или что-то подобное. В настоящее время это выполняется путем вызова commandGateway из обработчика событий в AuditService. Правильно ли вызывать commandGateway из EventListener, если нет, какова альтернатива?

Вопрос в том, является ли это правильным / лучшим способом ведения дел с использованием структуры Axon и пружины?

1 Ответ

0 голосов
/ 28 июня 2018

Трудно сказать, является ли это лучшим способом решения проблемы, так как для этого потребуется гораздо больше информации о вашем домене. Что я могу сказать, так это то, что вы делаете технически правильно. Вы упомянули, что не уверены, что событие, опубликованное после сохранения AuditEvent, публикуется, только когда изменения базы данных зафиксированы. Это зависит от того, как событие опубликовано. Если вы используете EventBus для его публикации и используете SpringAMQPPublisher, вы в безопасности. Если вы публикуете это напрямую, это может быть не так.

Axon использует unitOfWork для координации действий на разных этапах при обработке. Обработчики вызываются на начальном этапе. Фиксация базы данных выполняется на этапе после: 'commit' '. Если вы хотите быть уверенным в сообщении AMQP после фиксации, зарегистрируйте обработчик на этапе afterCommit. Обработчики для этой фазы не запускаются при откате. Вы можете добавить UnitOfWork в качестве параметра к аннотированному методу @EventHandler. Аксон автоматически введет его для вас.

...