#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. Существует ли готовое решение для решения проблемы атомарности приема и отправки сообщений? Ссылаясь на презентацию, представленную Уди Даханом