Pull to refresh

Comments 2

Всё очень хорошо и толково написано, но вот это я не совсем понял:


Еще одним важным правилом проектирования агрегатов является требование модифицировать только один экземпляр агрегата в рамках одной транзакции.

Возможно, имелось в виду "в рамках одной транзакции базы данных"? Потому что избежать необходимости обновления нескольких агрегатов в рамках одной бизнес-транзации ну никак, по-моему, не выйдет.

Большое спасибо за отличный вопрос!
Нет, здесь не имеется в виду транзакция базы данных. Транзакция базы данных - это уровень реализации. Агрегат определяет границы согласованности транзакций. Когда транзакция уровня агрегата передается в базу данных для сохранения, все составные части в пределах этого агрегата должны быть непротиворечивыми и соотвествовать бизнес-правилам. Под транзакцией здесь подразумевается способ изоляции изменений агрегата и поддержки бизнес-инвариантов. Бизнес-инварианты должны поддерживаться с целью обеспечения согласованности последующих (во времени) бизнес-операций. Не имеет значения, как будет осуществлен контроль этого требования - с помощью атомарной транзакции базы данных или других средств, - состояние агрегата должно быть безопасным, гарантирующим правильные переходы состояний.
Возвращаясь к вопросу о необходимости обновления нескольких агрегатов в рамках одной "бизнес-транзакции". Здесь скорее речь об итоговой согласованности. Методы ее достижения отличаются для разных типов интеграции. Я приведу пример для интеграции с рассылкой сообщений (другие варианты подробно описаны в книге Implementing Domain-Driven Design в рамках связывания контекстов). Обеспечить итоговую согласованность в случае асинхронной передачи данных можно посредством публикации событий предметной области. Агрегат после изменения своего внутреннего состояния публикует событие, которое получают и обрабатывают агрегаты-потребители. Цепочка этих действий должна приводить к итоговой согласованности в системе. Разумеется, доставка события в таком случае должна быть гарантированной.
В заключении хочу подчеркнуть мысль о том, что явного запрета на одновременное обновление нескольких агрегатов здесь не предполагается. Важно обеспечить два типа согласованности: транзакционную согласованность агрегата и итоговую согласованность. Если мы хотим выполнить одновременное обновление нескольких агрегатов для достижения итоговой согласованности, то важно убедиться, что внутренняя (транзакционная) согласованность каждого из них не будет нарушена. Каким образом будет обеспечен тот или иной уровень согласованности - вопрос реализации.

Sign up to leave a comment.

Articles