В чём суть 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 они избыточны.