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

Какие требования предъявляются к проекции, строящей модель чтения из потока событий?

MiddleCQRS и Event Sourcing
Ещё спрашивают так:
  • Что такое проекция в event sourcing?
  • Как перестроить проекцию без простоя?
Коротко

Проекция строит модель чтения из потока событий. Требования: идемпотентность, порядок внутри агрегата (партиционирование по его id), наблюдаемое отставание и возможность перестроить с нуля.

  • Доставка «хотя бы один раз» — повтор события не должен портить данные
  • Глобального порядка нет — гарантирован только внутри партиции
  • Проекций может быть много — каждая под свой экран

А ещё Перестроение: собрать новую версию рядом со старой и переключить чтение

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

Подробно

Идемпотентность. Брокер может доставить событие повторно (после сбоя потребителя до фиксации смещения). Проекция должна выдерживать повтор: хранить последнюю применённую версию агрегата и пропускать события не новее её, или делать операции идемпотентными по смыслу (UPSERT с полями из события, а не +1).

Порядок. События одного агрегата должны применяться в порядке их возникновения. Брокер гарантирует порядок только внутри партиции, поэтому ключ партиционирования — id агрегата. Между разными агрегатами порядок не гарантирован, и проекция не должна на него рассчитывать.

Много проекций — это нормально. Каждая заточена под свой сценарий (список заказов, поиск, отчёт по выручке), не мешает другим и может храниться в подходящем хранилище. Новый экран — новая проекция, без миграции основной модели.

Перестроение. Ошибку в проекции исправляют, проиграв все события заново. На больших объёмах: собрать новую версию проекции параллельно со старой (в новую таблицу или индекс), догнать текущий поток, переключить чтение, удалить старую. Это требует хранить события достаточно долго (хранилище событий или Kafka с длинным хранением / compaction).

Наблюдаемость: отставание по каждой проекции и ошибки обработки, очередь недоставленных для «ядовитых» событий.

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

  • Идемпотентная обработка и как её добиться.
  • Порядок внутри агрегата через ключ партиционирования.
  • Множество независимых проекций.
  • Перестроение без простоя и мониторинг отставания.

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

  • Рассчитывать на глобальный порядок событий.
  • Инкрементировать счётчики в проекции без защиты от повторов.

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

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

Показать варианты и ответ
  • ✓Обработка должна быть идемпотентной — доставка at-least-once, события будут повторяться
  • ✓Ключ партиционирования обычно совпадает с идентификатором агрегата, потому что порядок гарантирован только внутри потока
  • ✓Отставание проекции нужно измерять и мониторить как эксплуатационную метрику
  • ✗Проекция должна быть единственной, иначе представления разойдутся

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

  • Как перестроить проекцию без простоя?
  • Почему порядок гарантирован только внутри партиции?

Разбор темы

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

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

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

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

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