События, а не команды

Команда запрашивает операцию, а событие фиксирует произошедшее. Команда ShipOrder может быть отклонена; событие OrderShipped описывает принятый переход состояния.

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

Реляционная база тоже может хранить события и журнал аудита. Event Sourcing определяет способ сохранения и восстановления состояния приложения, а не запрещает реляционное хранение.

Восстановление состояния агрегата

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

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

Когда модель полезна

Event Sourcing подходит предметным областям, где важны переходы состояния, а сохранённая последовательность событий нужна для восстановления, разбора операций или дополнительных моделей чтения.

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

Когда проще хранить текущее состояние

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

Журнал аудита и контроль конкуренции возможны без Event Sourcing. Выбирайте подход ради его модели хранения, а не потому, что эти возможности якобы доступны только в нём.

DDD, CQRS и Event Sourcing

DDD определяет подход к моделированию предметной области, включая агрегаты и ограниченные контексты. Event Sourcing — способ хранения, который можно использовать с этой моделью; DDD его не требует.

CQRS разделяет модели для команд и запросов. Его часто применяют вместе с Event Sourcing, но это разные подходы, и ни один из них не требует микросервисов.

Практическое упражнение

Выберите один агрегат. Опишите его команды, инварианты и события, затем проверьте, достаточно ли применения событий для восстановления состояния, необходимого для принятия решений.

Путь обучения Event Sourcing · Далее · Документация Chronacta