Где нужно хранилище событий
Эти архитектурные примеры показывают место Chronacta в приложении. Они описывают подходы к проектированию, а не внедрения у клиентов.
Аудит на основе событий домена
Агрегат на Event Sourcing сохраняет события, из которых восстанавливается его состояние. Это позволяет приложению объяснять записанные переходы состояния.
Историю аудита можно хранить и в обычной базе данных. Отличие Event Sourcing в том, что события служат основными данными, а не отдельным описанием изменений текущего состояния.
Пригодность событий для аудита зависит от модели. Явно записывайте необходимые сведения об участнике, связи операций и контексте решения: хранилище не восстановит информацию, которую приложение не передало.
Воспроизведение и восстановление модели чтения
Повторно обрабатывайте события, чтобы пересобрать модель чтения после изменения или исправления логики проекции. Начинайте с начала либо с корректного сохранённого состояния и соответствующей ему позиции.
Для пересборки производных данных должна быть доступна нужная история событий. Воспроизведение не заменяет резервное копирование хранилища событий.
По возможности делайте обработчики проекций детерминированными. Не повторяйте внешние побочные эффекты при пересборке и определяйте обработку повторно доставленных событий.
Хранение агрегатов
Сохраняйте события экземпляра агрегата в его потоке. Восстанавливайте состояние перед выполнением поведения, которое от него зависит.
Добавляйте полученные события с версией, использованной при принятии решения. Если другая команда уже изменила поток, загрузите агрегат заново и повторно оцените команду либо верните конфликт.
Агрегат определяет границу согласованности. Если операция затрагивает несколько агрегатов, явно спроектируйте их координацию: проверка версии потока не является транзакцией между потоками.
Интеграция через события
Используйте устойчивую подписку для обработки сохранённых событий другим компонентом приложения и сохранения позиции обработки.
При интеграции ограниченных контекстов определяйте стабильный контракт. Внутренние события домена при необходимости преобразуйте в отдельные интеграционные события.
Учитывайте повторные попытки и повторную доставку. Сохранённая позиция помогает восстановить обработку, но не гарантирует однократного выполнения действия во внешней системе.
Когда достаточно более простого подхода
Хранение текущего состояния может быть проще, если использование последовательности событий как источника истины не даёт существенной пользы. Требования к аудиту или конкурентной записи сами по себе не делают Event Sourcing обязательным.
Используйте очередь для доставки заданий и аналитическое хранилище для аналитических нагрузок, если именно это нужно системе. Выбирайте хранилище событий, когда события являются сохраняемой моделью приложения.
