Должны ли агрегаты быть строго согласованными?
Все, что я прочитал на DDD, подразумевает, что состояние в агрегатах должно быть строго согласованным.
Это подразумевает, что если требуется одна избыточность, то может использоваться только строго согласованная репликация (например, 2PC, 3PC или Paxos).
Разрешено ли вам использовать в конечном итоге согласованную репликацию, например, multi-master или master-slave? Если вы их использовали, то есть ли у вас "агрегат" в терминах DDD? Это обычное дело?
1 ответ
Сам агрегат должен быть согласованным, однако связанные агрегаты могут в конечном итоге быть согласованными по отношению друг к другу. Фактически, конечная согласованность является обычной парадигмой DDD в распределенных сценариях. Совокупность может рассматриваться как граница согласованности. Это означает, что совокупность определяется с точки зрения того, что должно быть последовательным, а не является чистым отражением реальности.
Например, поведение агрегата может публиковать событие домена, которое затем публикуется извне. Внешний обработчик для этого события может в конечном итоге привести всю систему в согласованное состояние. Во многих случаях возможная согласованность является вполне приемлемым деловым ограничением, особенно потому, что возможная согласованность гораздо более распространена в реальности.
Взгляните на " Эффективный совокупный дизайн" Вона Вернона, чтобы узнать больше об этом.
ОБНОВИТЬ
В конечном итоге последовательная избыточность агрегатов должна оцениваться в каждом конкретном случае. Некоторые агрегаты будут хорошо подходить для разрешения конфликтов, возможно, с естественными компенсационными действиями. Эти типы конфликтов будут разрешаться аналогично конфликтам в стиле CQRS, когда требуются компенсационные действия для приведения системы в согласованное состояние. Как и в CQRS, последствия возможной согласованности следует обсудить с экспертами в предметной области.