Какие требования предъявляются к проекции, строящей модель чтения из потока событий?
- Что такое проекция в event sourcing?
- Как перестроить проекцию без простоя?
Проекция строит модель чтения из потока событий. Требования: идемпотентность, порядок внутри агрегата (партиционирование по его id), наблюдаемое отставание и возможность перестроить с нуля.
- Доставка «хотя бы один раз» — повтор события не должен портить данные
- Глобального порядка нет — гарантирован только внутри партиции
- Проекций может быть много — каждая под свой экран
А ещё Перестроение: собрать новую версию рядом со старой и переключить чтение
Подробно
Идемпотентность. Брокер может доставить событие повторно (после сбоя потребителя до фиксации смещения). Проекция должна выдерживать повтор: хранить последнюю применённую версию агрегата и пропускать события не новее её, или делать операции идемпотентными по смыслу (UPSERT с полями из события, а не +1).
Порядок. События одного агрегата должны применяться в порядке их возникновения. Брокер гарантирует порядок только внутри партиции, поэтому ключ партиционирования — id агрегата. Между разными агрегатами порядок не гарантирован, и проекция не должна на него рассчитывать.
Много проекций — это нормально. Каждая заточена под свой сценарий (список заказов, поиск, отчёт по выручке), не мешает другим и может храниться в подходящем хранилище. Новый экран — новая проекция, без миграции основной модели.
Перестроение. Ошибку в проекции исправляют, проиграв все события заново. На больших объёмах: собрать новую версию проекции параллельно со старой (в новую таблицу или индекс), догнать текущий поток, переключить чтение, удалить старую. Это требует хранить события достаточно долго (хранилище событий или Kafka с длинным хранением / compaction).
Наблюдаемость: отставание по каждой проекции и ошибки обработки, очередь недоставленных для «ядовитых» событий.
Что хотят услышать
- Идемпотентная обработка и как её добиться.
- Порядок внутри агрегата через ключ партиционирования.
- Множество независимых проекций.
- Перестроение без простоя и мониторинг отставания.
Частые ошибки
- Рассчитывать на глобальный порядок событий.
- Инкрементировать счётчики в проекции без защиты от повторов.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Обработка идемпотентна: доставка at-least-once, события повторяются
- ✓Ключ партиции — id агрегата: порядок гарантирован только внутри потока
- ✗Проекция должна быть единственной на поток событий, иначе разные представления разойдутся
- ✓Отставание проекции измеряют и мониторят
Что спросят дальше
- Как перестроить проекцию без простоя?
- Почему порядок гарантирован только внутри партиции?
Разбор темы
- CQRS и Event Sourcing
Разделение моделей чтения и записи, цена рассинхронизации, событие как источник истины, снапшоты и версионирование событий, и честный ответ на вопрос «когда это не нужно».
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.