DDD и сообщения для обмена агрегатами

#java #mongodb #domain-driven-design

#java #mongodb #дизайн, управляемый доменом

Вопрос:

Я пишу приложение для упражнений, используя принципы DDD на java с spring boot и mongodb. Согласно DDD, связь между агрегатами происходит только через обмен сообщениями. На данный момент я не распространяю приложение, все агрегаты находятся в одном приложении, поэтому я просто использую возможности Spring Messaging для обмена сообщениями.

Каждый агрегат соответствует ровно одному документу mongo. Каждая команда или операция, запускаемая событием, защищается аннотацией @Transactional, чтобы гарантировать, что транзакция db и событие обрабатываются атомарно. Мне было интересно, где я должен хранить события? Могу ли я сохранить их в документе mongo? На самом деле, поскольку транзакции mongo охватывают отдельные документы, разве это не единственный вариант?

Следующим шагом является установка периодической задачи, которая будет считывать все последние события и публиковать их для имитации связи вне потока. На данный момент, вероятно, хорошим местом будет отдельная коллекция документов, в которой хранятся события.

PS На данный момент я не принимаю во внимание источники событий, поскольку они кажутся более продвинутыми.

Спасибо!

Ответ №1:

Мне было интересно, где я должен хранить события?

Обычная линия мышления заключается в том, что распределенные транзакции отстой; поэтому, если вы можете управлять этим, вы хотите сохранить события с агрегированным состоянием. В мире СУБД ваши события хранятся в таблице, которая находится в той же схеме базы данных, что и ваши агрегированные данные — см. Udi Dahan, 2014.

Если это поможет, вы можете думать об этом «исходящих» сообщениях о событиях как о другой сущности в вашем агрегате.

После успешного сохранения вы работаете над проблемой копирования информации в разные места, где она должна быть, уделяя пристальное внимание режимам сбоев. На данный момент это чисто «водопроводная» проблема, то есть обычно она рассматривается как проблема приложений и инфраструктуры, а не как проблема домена.

Комментарии:

1. спасибо за ваш ответ. Поскольку в Mongo нет транзакций, охватывающих несколько документов, я попытался использовать его, чтобы заставить себя думать о агрегате как о единой единице транзакции, имея взаимно однозначное соединение между агрегатом и документом, и потому, что до сих пор я в основном использовал реляционную БД. Но да, я согласен, что это не проблема, которую должен решать агрегат.

2. Существует ли готовое решение для решения проблемы атомарности приема и отправки сообщений? Ссылаясь на презентацию, представленную Уди Даханом