Вы можете обычно (это зависит, как всегда) отобразить один ограниченный контекст на один микросервис.
Микросервис может использовать несколько агрегатов.
Граница транзакции - это операция, которую выполняет агрегат. Эта операция не может быть отклонена / отменена / откат ничем вне агрегата. Если агрегат говорит «ДА», то это потому, что ВСЕ бизнес-правила и инвариант проверены. Необходимость отклонить / отменить / откатить агрегатную операцию извне агрегата - запах неправильного дизайна.
СОВЕТ: Помимо чисто неправильных конструкций, мелкозернистые операции были решением многих потенциальных "отменных" встреч. Пользователь не «Оплачивает» при нажатии кнопки «Оплатить». Поскольку вам необходимо отменить зарегистрированную операцию «Оплатить» (агрегат говорит, что, насколько ему известно, пользователь может заплатить), если банк отклонит операцию. Пользователь запускает бизнес-операцию «Оплатить», которая состоит из нескольких шагов:
«Заказать платеж»: зарегистрируйте заказ и создайте событие UserOrderedPayment, если агрегат скажет «ОК». После этого все остальное - внутренние события / операции в вашей системе.
Событие UserOrderedPayment запускает начисление денег. В случае неудачи возникает событие UserOrderPaymentRejected, и Платежное поручение помечается как отклоненное. Если деньги начисляются без проблем, тогда регистрируется новый Платеж и возникает событие UserPaid.
О
Окончательная согласованность внутри самого Микросервиса
с мелкозернистой конструкцией, как указано выше; в самой MS нет никакой согласованности, поскольку каждый шаг находится в согласованном состоянии. Платежное поручение может находиться в состоянии ожидания (но это действительный и непротиворечивый статус), хорошо, просто подождите несколько миллисекунд и обновите; -).
Атомарное обновление агрегатов и публикация событий домена
в микросервисе устойчивым образом
Опять; с мелкозернистой конструкцией, как указано выше; граница транзакции - это всего лишь один агрегат, поэтому нет «атомарного обновления агрегата s ». Поскольку события домена (в пределах одной и той же MS или нет) не должны отклоняться, они терпят неудачу только из-за отключений инфраструктуры (сеть, постоянство и т. Д.), Поэтому лучшая стратегия состоит в том, чтобы хранить где-нибудь сбойные события и вызывать их, когда перерыв закончился.
Решение о том, должны ли все события домена быть опубликованы извне
(к другим микросервисам) или только некоторые из них
Вы должны перевернуть ответственность здесь. Всегда инициируйте события домена и предоставьте способ подписаться на эти события. Таким образом, ответственность ложится на заинтересованный микросервис, который должен подписаться на необходимые события.
Принятие решения о публикации событий домена в форме
события интеграции с целью сохранения чистоты модели предметной области
Вам нужно вызывать только те же доменные события, ваш код интеграции может подписаться на эти события и выполнить действие интеграции.