CQRS агрегаты

Я новичок в мире CQRS/ES, и у меня есть вопрос. Я работаю над веб-приложением для выставления счетов, которое использует источники событий и CQRS.

Мой вопрос заключается в следующем - насколько я понимаю, новая команда, поступающая в систему (скажем, ChangeLineItemPrice), должна проходить через модель домена, чтобы ее можно было проверить как допустимую команду (например, чтобы проверить, существует ли эта позиция на самом деле, цена не нарушает никаких бизнес-правил и т. д.). Если все идет хорошо (команда не отклоняется) - то соответствующее событие создается и сохраняется (например, LineItemPriceChanged)

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

Если я неправильно понял какую-либо часть процесса, я был бы признателен за ваш отзыв.

Спасибо за вашу помощь!

2 ответа

Решение

Вы не одиноки, это распространенное недоразумение. Позвольте мне сначала ответить на часть проверки:

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

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

На следующем этапе домен должен применить изменение состояния и инициировать связанные события. Затем они сохраняются и в случае успеха публикуются для остальной части приложения.

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

Как видите, он загружает только события для этого конкретного агрегата. Даже с большим количеством событий этот процесс молниеносно. Если производительность является проблемой, существуют стратегии, такие как хранение агрегатов в памяти или моментальные снимки, которые вы можете применить.

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

Если вы хотите получить более подробную информацию, посмотрите мой обзор CQRS и ES здесь. И посмотрите на мой пост о том, как построить совокупные корни здесь.

Удачи - надеюсь, они помогут!

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

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

Другие вопросы по тегам