Вопрос с собеседования · System design

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования