Как обработать основанную на наборе проверку непротиворечивости в CQRS?

У меня есть довольно простая модель предметной области, включающая список Facility совокупные корни. Учитывая, что я использую CQRS и шину события для обработки событий, сгенерированных от домена, как Вы могли обработать проверку на наборах? Например, скажите, что у меня есть следующее требование:

  1. Facilityдолжен иметь уникальное имя.

Так как я использую в конечном счете последовательную базу данных по стороне запроса, данные в ней, как гарантируют, не будут точны в то время, когда событие processesor обрабатывает событие.

Например, a FacilityCreatedEvent находится в очереди обработки событий базы данных запроса, ожидающей, чтобы быть обработанным и записанным в базу данных. Новое CreateFacilityCommand отправляется в домен, который будет обработан. Доменные сервисы запрашивают базу данных чтения, чтобы видеть, существует ли кто-либо другой Facilityзарегистрированный уже в том имени, но возвращает false потому что CreateNewFacilityEvent еще не был обработан и записан в хранилище. Новое CreateFacilityCommand теперь успешно выполнится и подбросит другого FacilityCreatedEvent который аварийно завершился бы, когда процессор события пытается записать это в базу данных и находит что другой Facility уже существует с тем именем.

28
задан JD Courtoy 26 May 2010 в 21:18
поделиться

1 ответ

Решение, которое я выбрал, заключалось в добавлении агрегированного корня System , который мог бы поддерживать список текущих имен Facility . При создании нового объекта я использую агрегат System (только один System как глобальный объект / синглтон) в качестве его фабрики. Если данное название объекта уже существует, то будет выдана ошибка проверки.

Это сохраняет ограничения проверки в пределах домена и не полагается на в конечном итоге согласованное хранилище запросов.

18
ответ дан 28 November 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: