Получить доступ

Что относится к обязательной технической механике Event Sourcing?

MiddleCQRS и Event Sourcing
Ещё спрашивают так:
  • Что такое снапшоты в event sourcing?
  • Как версионировать события?
  • Как удалить персональные данные из журнала событий?
Коротко

Обязательная механика: снапшоты (не проигрывать миллион событий), оптимистичная блокировка по версии потока (конкурентные команды), версионирование и апкастинг событий. Записанные события не редактируют.

  • Снапшот — сохранённое состояние на версии N; дальше применяются только события после N
  • Добавление события проверяет ожидаемую версию потока; расхождение — повтор команды
  • Старые версии событий преобразуют при чтении (upcasting) или заводят новые типы

А ещё Персональные данные: крипто-шреддинг — шифровать ключом пользователя и удалить ключ

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Снапшоты. Состояние агрегата получается применением всех его событий. Для длинных потоков это дорого, поэтому периодически (каждые N событий) сохраняют снапшот и при загрузке применяют только события после него. Снапшот — оптимизация: его можно удалить и пересобрать.

Конкурентность. Две команды к одному агрегату читают его на версии 41 и обе хотят записать событие 42. Хранилище событий принимает добавление с ожидаемой версией: второе получит конфликт, перечитает агрегат и повторит команду или откажет. Это оптимистичная блокировка на уровне потока.

Версионирование — самая недооценённая часть. События записаны навсегда, а код меняется: поле переименовали, добавили обязательное. Подходы:

  • апкастинг — при чтении старые версии преобразуются в текущую;
  • новые типы событий вместо изменения старых;
  • слабая схема (JSON с толерантным чтением) и значения по умолчанию.

Неизменяемость. Ошибочное событие не исправляют, а компенсируют новым (СписаниеОтменено). Отсюда проблема права на удаление данных: решают крипто-шреддингом — персональные данные шифруются ключом пользователя, а для «удаления» уничтожается ключ.

Ещё: глобальный порядок событий обычно не нужен и дорог — порядок гарантируется внутри потока агрегата; публикация событий для проекций — через подписки хранилища или outbox.

Что хотят услышать

  • Снапшоты и зачем.
  • Оптимистичная блокировка по версии потока.
  • Версионирование и апкастинг.
  • Неизменяемость журнала, компенсирующие события, крипто-шреддинг.

Частые ошибки

  • Предлагать исправлять события в хранилище.
  • Забывать про версионирование до первого изменения схемы.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Снапшоты состояния, чтобы не проигрывать весь поток событий с нуля
  • ✓Оптимистичная конкуренция по ожидаемой версии потока агрегата
  • ✓Версионирование событий и апкастинг старых версий при чтении
  • ✗Возможность отредактировать записанное событие при изменении бизнес-правил

Что спросят дальше

  • Как удалить персональные данные из неизменяемого лога?
  • Как перестроить проекцию на больших объёмах без простоя?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем