CQRS - когда объединяются корни в базе данных и в файле? - PullRequest
1 голос
/ 17 марта 2012

Я начал планировать свой первый проект CQRS с источником событий, и из-за нехватки времени часть модели останется в файлах XML. Что я понимаю из DDD, так это то, что каждое обновление выполняется для агрегатного корня, и если я хочу изменить другой агрегатный корень из первого (событие вызывается в домене), то сначала выполняется команда для изменения второго агрегата. Каждое изменение имеет собственную транзакционную границу.

Теперь, что меня беспокоит, если я зафиксировал изменение в первом агрегате (в базе данных), как мне справиться с ситуацией, когда происходит сбой второго агрегата (запись в файл в этом случае)?

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

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

Все еще пытаюсь понять концепции в моей голове, чтобы любая помощь была оценена.

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

Второй агрегат может генерировать что-то вроде события UpdateFailed.Это, в свою очередь, может быть выполнено путем отправки команды отката в первый агрегат.

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

Обновление: Также взгляните на концепцию, называемую "Сага".Сага может быть полезным координатором таких процессов, как ваш.Сага - это обработчик событий, который отправляет команды в соответствии с полученными событиями.Сага может быть просто координатором без сохранения состояния, но она также может быть с состоянием, поэтому она знает, какие команды нужно будет компенсировать в случае неудачи последующей.Просто погуглите "CQRS Saga" и отправляйтесь оттуда.Особенно полезны для чтения статьи Грега Янга и Рината Абдуллина.

1 голос
/ 17 марта 2012

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

Однако, в общем случае, если второй агрегат должен обновляться на основе команды первого агрегата, то, возможно, они находятся в одной транзакции (DDD «Bounded-Context»).Это действительно трудно понять без контекста.

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

Помогает ли это?

...