То, что вы спрашиваете, - это проблема, которая может возникнуть, как только вы начнете реализовывать приложение в соответствии с парадигмой CQRS и методами моделирования DDD.
PersonnelCardAggregate
в вашем сценарии поддерживает границу согласованностисингл "Кадровая карточка". Однако вы хотите расширить эту область, чтобы достичь ограничений уникальности среди всех кадровых карт в вашей системе.
Мне кажется, что этот блог объясняет проблему " проверки согласованности на основе набора ", которой вы являетесьвстречая довольно приятно. Я не буду повторять весь его блог, но он резюмирует, что у него есть четыре варианта решения проблемы:
- Введение блокировок, транзакций и ограничений базы данных для вашей карты персонала
- Использованиеполе гибридной блокировки перед выполнением команды
- Действительно в конечном итоге непротиворечивая модель запроса
- Пересмотреть модель домена
Если честно, вариант 1 не будетесли вы используете управляемый событиями подход к обновлению вашей модели команд и запросов. Вариант 3 был отклонен вами в исходном вопросе.
Вариант 4 - это то, что я не могу для вас сделать вывод, учитывая, что я не эксперт в области, но я предполагаю, что PersonnelCardAggregate
не принадлежитбольший инкапсулирующий агрегатный корень. Может быть, указанное вами ограничение бизнеса, таким образом, возможность повторного использования personalNumbers
, может быть удалено или скорректировано? Как я уже сказал, я не могу утверждать, что это фактический ответ для вас, так как я не эксперт по предметной области.
Это оставляет вариант 2, который, на мой взгляд, также будет самым прагматичным. Я чувствую, что это потребовало бы комбинации кэша на вашей стороне диспетчера команд, чтобы иметь дело с быстрой последовательностью команд для решения возможной проблемы согласованности. Чтобы зафиксировать случаи, когда обновление по-прежнему происходит случайно, я бы представил некоторую форму обработчика событий, которая (1) знает весь набор «PersonnelCards» с точки зрения personalNumber
/ archived
и (2) можетреагировать на ошибочное введение, отправляя компенсирующее действие.
Таким образом, вы бы представили некоторую бизнес-логику на стороне обработки событий вашего приложения, которую я настоятельно рекомендовал бы отделить от части приложения, которая обновляет ваш запрос. модели (так как варианты использования совершенно разные).
В заключение, это сложная тема с несколькими путями ее решения. Кстати, это не столько проблема, специфичная для Axon, сколько моделирование вашего приложения с помощью DDD и CQRS.