Взаимодействие между различными агрегатами в CQRS - PullRequest
0 голосов
/ 22 марта 2019

Так что я немного новичок в CQRS (хотя и не совсем новичок).Я пытаюсь понять лучшие практики, когда дело доходит до взаимодействия агрегатов.Я немного читал об использовании событий интеграции (вместо событий домена) в этой ситуации, а также немного о доменных службах (которые предположительно связывали бы 2 агрегата), но нигде не смог найти хорошего однозначного ответа (особенно на * 1001).* axonIQ Руководство по началу работы

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

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Взаимодействие компонентов в системе CQRS может происходить на нескольких уровнях. По мнению Максима, с Microservices очень четко показывает фокус обмена сообщениями всего этого.

Несмотря на это, это может происходить так же просто в пределах одного Приложения / Монолита, у которого есть несколько типов Агрегатов, которые вместе должны запускать некоторую операцию.

Я чувствую, что Максим дает вам ответ, который вам нужен. Агрегатные экземпляры, которым вы отправляете команды, действуют самостоятельно и не привязываются друг к другу напрямую, вообще . Таким образом, вы будете реагировать на события как на движущую силу начала взаимодействия между ними.

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

Наконец, вы утверждаете, что часть «Начало работы» Справочного руководства Axon не совсем ясна по этой теме. Я думаю, что это верный вывод, поскольку, с точки зрения Аксона, это , а не часть начала работы. Взгляните на Saga часть руководства, чтобы получить представление о взаимодействии Агрегатов и / или Ограниченных Контекстов.

1 голос
/ 25 марта 2019

Если вы думаете об этом с точки зрения микросервисов (это философия, которая очень хорошо подходит для CQRS), у вас должен быть один агрегат для одного микросервиса.Таким образом, вы не можете общаться между агрегатами в памяти, потому что они не являются частью одного и того же процесса.Хороший способ сделать это - использовать события, которые вы можете опубликовать в шине событий.Таким образом, клиент отправляет команду «объединить A», используя API этого микросервиса (то есть «микросервис A») (или, возможно, шлюз API).Затем «агрегат А» сохраняется и события, сгенерированные «агрегатом А», публикуются на шине событий, так что некоторый процесс (он же обработчик событий) в «микросервисе В» может перехватить событие (я) и отправить соответствующие команды"агрегат B".

Это всего лишь один из способов сделать это, есть гораздо больше, и это может быть очень сложным, но я надеюсь, что это помогает получить общую картину.

...