Senior
80
questionbank

Что такое паттерн Event Sourcing и в каких случаях его следует использовать?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Event Sourcing - это архитектурный паттерн, при котором все изменения состояния приложения сохраняются как последовательность неизменяемых событий. Каждое событие представляет собой факт, произошедший в системе. Текущее состояние системы восстанавливается путем "проигрывания" всех событий в хронологическом порядке.

Ключевые принципы:

  • Неизменяемость: События не удаляются и не изменяются.
  • Последовательность: События сохраняются в строгом хронологическом порядке.
  • Восстановление состояния: Актуальное состояние формируется на основе истории событий.

Преимущества:

  • Полная история изменений: Позволяет отследить каждое действие, приведшее к текущему состоянию.
  • Отладка и аудит: Облегчает поиск причин ошибок и анализ поведения пользователей.
  • Time-travel debugging: Возможность "откатиться" к любому моменту в прошлом.
  • Гибкость для изменения проекций: Легко создавать различные представления данных на основе одного потока событий.
  • Пассивная интеграция: Другие системы могут подписываться на поток событий.

Недостатки:

  • Сложность реализации: Требует изменения мышления и инфраструктуры для хранения и обработки событий.
  • Восстановление состояния может быть долгим для большого количества событий.
  • Сложности с удалением данных (GDPR и т.д.).

Применение:

  • Сложные доменные модели: Где важна история изменений и причинно-следственные связи.
  • Системы аудита и логирования: Для детального отслеживания операций.
  • Приложения, где требуется "машина времени": Например, финансовые системы или игры.
  • Системы с высокой степенью параллелизма: События легко обрабатываются асинхронно.
  • Системы, требующие гибкой адаптации к новым требованиям: Легко строить новые представления данных.

Следует использовать, когда:

  • История изменений является важной функциональностью.
  • Требуется детальный аудит действий пользователей или системы.
  • Возможность "отката" к предыдущим состояниям неоценима.
  • Планируется создание различных "проекций" данных для разных целей (например, read models).
  • Предполагается интеграция с другими системами путем подписки на события.

Пример структуры события:

plaintext

Пример загрузки агрегата из событий:

php