Как вы обрабатываете совокупный корень с набором дочерних объектов, частота обновления которых отличается от корня?

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

Моей первой реакцией было разделить их на два разных совокупных корня из-за наших требований к приложению. Но мне напомнили о правиле каскадного удаления: если мы удаляем одно, удаление должно происходить каскадно, поэтому их время жизни связано.

Мы наткнулись на эту проблему, когда обнаружили, что у нас проблема с кэшированием. Изменения дочерних сущностей (конфигурации) не отражались в системе во время выполнения, потому что родитель не знал об изменениях (у нас они были как один совокупный корень, но кто-то создал репозиторий для его дочерних элементов).


person uriDium    schedule 24.05.2016    source источник
comment
Почему разная частота обновлений является проблемой? Если единственная проблема, которая у вас есть, связана с тем, что кто-то создал репо для детей, то ваш вопрос принадлежит программистам. SE - у вас проблема с людьми / процессом, а не техническая.   -  person theDmi    schedule 24.05.2016
comment
Потому что транснациональных обновлений будет миллионы в день. Данные конфигурации, обновления дочерних объектов будут происходить, возможно, раз в месяц. Нам нужна скорость, а постоянная перезапись строк неизмененными данными убьет систему. Но это техническая проблема, которая привела к проблеме процесса, потому что люди не знали, как правильно решить эту проблему.   -  person uriDium    schedule 24.05.2016
comment
Разве основной агрегат не нуждается в настройке для выполнения своих задач? Это означало бы, что всегда нужно загружать конфигурацию, нет?   -  person plalx    schedule 24.05.2016


Ответы (2)


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

Каскадное удаление (в отношении совокупных границ) скорее желательно, чем правило. Вы всегда можете обеспечить тот факт, что Parent все еще живет, потребовав его в том месте, где вы загружаете Child объекты. Благодаря этому дизайну вы можете создавать Parent и Child разные агрегаты, сохраняя при этом правило, согласно которому никакие "свободно плавающие" Child агрегаты не могут быть запрошены. А удалить агрегаты Child в ответ на удаленный Parent легко, если у вас есть доменные события.

Примечание. Все это исходит из предположения, что инварианты вашего домена позволяют в первую очередь разделять агрегаты.

person theDmi    schedule 24.05.2016
comment
Не могли бы вы уточнить, что позволит или не позволит разделить агрегаты. - person uriDium; 24.05.2016
comment
Это полностью зависит от правил вашего домена, поэтому вы должны выяснить это вместе со своими экспертами по домену. Как правило, это компромисс между необходимостью изменения вместе и возможностью одновременного изменения другим пользователем. Этот ответ содержит небольшое руководство и пример для поиска этих правил. - person theDmi; 24.05.2016

Это может быть лучше в формате обсуждения, а не в формате вопросов и ответов. Я бы рекомендовал попробовать аудиторию на DomainDrivenDesign или DDDCQRS

Вы уверены, что у вас есть бизнес-требование по удалению данных в вашей модели домена? Это действительно необычно — в большинстве моделей доменов, которые я видел, агрегат достигает состояния «конца жизни» (пример: AccountClosed), но фактически не удаляется из системы.

Распространенная ловушка в агрегированном дизайне — думать о структуре сущностей. «А имеет Б» не обязательно означает, что они являются частью одного и того же агрегата; ключевая идея заключается в том, что «A должен поддерживать согласованность B и C». Вы можете думать об этом как о графике; состояние B и состояние C — узлы в графе, правила согласованности — ребра. Если вы не можете пройти по графу от B до C, то они не должны быть частью одного и того же агрегата и, вероятно, не должны быть.

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

В этом на меня повлияло эссе Уди Дахана Гоночные условия не Существует; связывая этот набор конфигураций с остальной частью агрегата, вы, по сути, утверждаете, что изменения в конфигурации (которые случаются редко) понимаются бизнесом как происходящие точно между двумя другими изменениями агрегата. 3M транзакций в день в среднем 1 за 30 мс; Вы действительно точно планируете изменения конфигурации?

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

Последнее из них обычно выполняется, когда клиенты/приложение проверяют свою локальную копию коллекции и убеждаются, что отправленная команда согласуется с этой перед отправкой команды в модель предметной области. (Возможные вопросы к экспертам в вашей области: как быстро нужно применять изменения конфигурации? Происходят ли изменения конфигурации, когда совокупность часто меняется или когда она тихая?)

Другой возможностью может быть изменение вашей стратегии настойчивости; если коллекция не меняется часто, то с ней связано не так много событий изменения. Поэтому, возможно, вместо того, чтобы сохранять агрегат, вы изучаете сохранение его истории — другими словами, используя здесь источник событий. Может быть, если бы этот агрегат жил в микросервисе, можно было бы ограничить риск изменения? Трудно сказать, при миллионе транзакций в день этот агрегат кажется довольно важным.

person VoiceOfUnreason    schedule 24.05.2016
comment
У ваших приложений никогда не было требований конфиденциальности? Это довольно хорошая причина для фактического удаления данных, а не просто скрытия их. - person theDmi; 25.05.2016