Агрегатная регидратация DDD CQRS ES

#domain-driven-design #cqrs

#проектирование, управляемое доменом #cqrs

Вопрос:

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

Ответ №1:

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

Пример:

Текущий поток событий:

 1. MyEvent1
 

Затем выполните команду, которая генерирует несколько событий:

 MyCommand emits ->
  MyEvent1
  MyEvent2
 

Эти события будут добавлены к потоку событий как атомарная операция.

Новый поток событий:

 1. MyEvent1
2. MyEvent1
3. MyEvent2
 

Теперь, при регидратации агрегата, вы просто читаете весь поток событий до конца, и все готово.

Ответ №2:

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

Обычно

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

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

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

В мире CQRS это будет включать создание модели чтения путем загрузки истории, а затем воспроизведение событий в фиксированном порядке, в котором они были записаны.

Ответ №3:

Это зависит от вашего базового хранилища. Распространенным способом реализации атомарной записи для постоянного хранилища, которое не поддерживает транзакции, является создание пакета событий и запись его как одной операции.

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

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

Удачи