PassFront
  1. PassFront
  2. База знаний
  3. Архитектурные паттерны

В чём суть CQRS и Event Sourcing и какова их цена?

Архитектурные паттерны

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

CQRS

  • Команда PlaceOrder проходит через доменную модель; запрос читает денормализованную проекцию — отдельную таблицу, Elasticsearch, Redis.
  • Выгода: чтение и запись масштабируются и оптимизируются раздельно, а чтений обычно на порядки больше.
  • Цена: при раздельных хранилищах проекции обновляются асинхронно — eventual consistency, и пользователь может не увидеть свой заказ сразу после создания.

Event Sourcing

  • Баланс счёта — свёртка событий: Deposited(100), Withdrawn(30) → reduce → 70.
  • Плюсы: полный аудит, состояние на любую дату, новые проекции строятся перечитыванием журнала.
  • Снапшоты каждые N событий ускоряют загрузку агрегата.
  • Атомарность записи и публикации события — Transactional Outbox; в ES источником публикации служит сам журнал.

Цена Event Sourcing

  • Версионирование: старые события неизменны, для новых схем нужны upcaster'ы.
  • GDPR и удаление персональных данных из неизменяемого лога — crypto-shredding или хранение ПДн вне событий.
  • Любой запрос по текущему состоянию требует проекции.

Когда не нужно

CRUD, админки, небольшая команда: одна модель и одна БД проще, а CQRS добавит лишь синхронизацию проекций.

Коротко для собеседования

CQRS разводит команды и запросы по разным моделям, Event Sourcing делает источником истины журнал событий вместо текущего состояния. Вместе они дают аудит и масштабирование чтения, но платишь eventual consistency, версионированием событий и сложностью, поэтому для CRUD они избыточны.

Другие вопросы раздела