Что относится к обязательной технической механике Event Sourcing?
- Что такое снапшоты в event sourcing?
- Как версионировать события?
- Как удалить персональные данные из журнала событий?
Обязательная механика: снапшоты (не проигрывать миллион событий), оптимистичная блокировка по версии потока (конкурентные команды), версионирование и апкастинг событий. Записанные события не редактируют.
- Снапшот — сохранённое состояние на версии N; дальше применяются только события после N
- Добавление события проверяет ожидаемую версию потока; расхождение — повтор команды
- Старые версии событий преобразуют при чтении (upcasting) или заводят новые типы
А ещё Персональные данные: крипто-шреддинг — шифровать ключом пользователя и удалить ключ
Подробно
Снапшоты. Состояние агрегата получается применением всех его событий. Для длинных потоков это дорого, поэтому периодически (каждые N событий) сохраняют снапшот и при загрузке применяют только события после него. Снапшот — оптимизация: его можно удалить и пересобрать.
Конкурентность. Две команды к одному агрегату читают его на версии 41 и обе хотят записать событие 42. Хранилище событий принимает добавление с ожидаемой версией: второе получит конфликт, перечитает агрегат и повторит команду или откажет. Это оптимистичная блокировка на уровне потока.
Версионирование — самая недооценённая часть. События записаны навсегда, а код меняется: поле переименовали, добавили обязательное. Подходы:
- апкастинг — при чтении старые версии преобразуются в текущую;
- новые типы событий вместо изменения старых;
- слабая схема (JSON с толерантным чтением) и значения по умолчанию.
Неизменяемость. Ошибочное событие не исправляют, а компенсируют новым (СписаниеОтменено). Отсюда проблема права на удаление данных: решают крипто-шреддингом — персональные данные шифруются ключом пользователя, а для «удаления» уничтожается ключ.
Ещё: глобальный порядок событий обычно не нужен и дорог — порядок гарантируется внутри потока агрегата; публикация событий для проекций — через подписки хранилища или outbox.
Что хотят услышать
- Снапшоты и зачем.
- Оптимистичная блокировка по версии потока.
- Версионирование и апкастинг.
- Неизменяемость журнала, компенсирующие события, крипто-шреддинг.
Частые ошибки
- Предлагать исправлять события в хранилище.
- Забывать про версионирование до первого изменения схемы.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Снапшоты состояния, чтобы не проигрывать весь поток событий с нуля
- ✓Оптимистичная конкуренция по ожидаемой версии потока агрегата
- ✓Версионирование событий и апкастинг старых версий при чтении
- ✗Возможность отредактировать записанное событие при изменении бизнес-правил
Что спросят дальше
- Как удалить персональные данные из неизменяемого лога?
- Как перестроить проекцию на больших объёмах без простоя?
Разбор темы
- CQRS и Event Sourcing
Разделение моделей чтения и записи, цена рассинхронизации, событие как источник истины, снапшоты и версионирование событий, и честный ответ на вопрос «когда это не нужно».
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.