Event Sourcing - это архитектурный паттерн, при котором все изменения состояния приложения сохраняются как последовательность неизменяемых событий. Каждое событие представляет собой факт, произошедший в системе. Текущее состояние системы восстанавливается путем "проигрывания" всех событий в хронологическом порядке.
Ключевые принципы:
- Неизменяемость: События не удаляются и не изменяются.
- Последовательность: События сохраняются в строгом хронологическом порядке.
- Восстановление состояния: Актуальное состояние формируется на основе истории событий.
Преимущества:
- Полная история изменений: Позволяет отследить каждое действие, приведшее к текущему состоянию.
- Отладка и аудит: Облегчает поиск причин ошибок и анализ поведения пользователей.
- Time-travel debugging: Возможность "откатиться" к любому моменту в прошлом.
- Гибкость для изменения проекций: Легко создавать различные представления данных на основе одного потока событий.
- Пассивная интеграция: Другие системы могут подписываться на поток событий.
Недостатки:
- Сложность реализации: Требует изменения мышления и инфраструктуры для хранения и обработки событий.
- Восстановление состояния может быть долгим для большого количества событий.
- Сложности с удалением данных (GDPR и т.д.).
Применение:
- Сложные доменные модели: Где важна история изменений и причинно-следственные связи.
- Системы аудита и логирования: Для детального отслеживания операций.
- Приложения, где требуется "машина времени": Например, финансовые системы или игры.
- Системы с высокой степенью параллелизма: События легко обрабатываются асинхронно.
- Системы, требующие гибкой адаптации к новым требованиям: Легко строить новые представления данных.
Следует использовать, когда:
- История изменений является важной функциональностью.
- Требуется детальный аудит действий пользователей или системы.
- Возможность "отката" к предыдущим состояниям неоценима.
- Планируется создание различных "проекций" данных для разных целей (например, read models).
- Предполагается интеграция с другими системами путем подписки на события.
Пример структуры события:
plaintext
Пример загрузки агрегата из событий:
php