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

После перехода на отдельное хранилище для чтения пользователи жалуются: сохранённое изменение не сразу видно в списке. Как правильно к этому отнестись?

MiddleCQRS и Event Sourcing
Ещё спрашивают так:
  • Почему после сохранения изменение не видно в списке?
  • Как жить с отставанием модели чтения?
Коротко

Отставание модели чтения — свойство полного CQRS, а не дефект: его закладывают в продукт и интерфейс.

  • Оптимистичное обновление на клиенте: показать результат из ответа на команду
  • Свои изменения читать из модели записи (read-your-own-writes)
  • Явный статус «обрабатывается», ожидание версии проекции

А ещё Синхронное обновление проекции в той же транзакции убивает смысл разделения

Подробно

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

Приёмы:

  • оптимистичное обновление — клиент сразу показывает сохранённое из ответа на команду, не перечитывая список;
  • read-your-own-writes — собственные недавние изменения пользователя читать из модели записи или подмешивать к результату проекции;
  • ожидание версии — команда возвращает версию (позицию события), а запрос на чтение ждёт, пока проекция её догонит (с таймаутом);
  • честная индикация — «заказ обрабатывается», «изменения появятся через несколько секунд».

Что не делать: обновлять проекцию синхронно в транзакции команды — тогда модели снова связаны, и выгода разделения теряется.

Эксплуатация: отставание проекции — обязательная метрика с алертом; при росте — масштабировать потребителей, искать медленную обработку.

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

  • Понимание, что отставание — встроенное свойство.
  • Конкретные приёмы в интерфейсе и API.
  • Почему синхронное обновление проекции — плохая идея.
  • Мониторинг отставания.

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

  • Объявлять это багом и делать синхронную проекцию.
  • Не мерить отставание.

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

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Это свойство схемы; его закладывают в UX: оптимистичное обновление, чтение своих записей
  • ✗Нужно вернуться к единой модели — CQRS здесь неприменим
  • ✗Достаточно чаще опрашивать проекцию на клиенте
  • ✗Это баг синхронизации: проекцию надо обновлять синхронно в той же транзакции

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

  • Что такое read-your-own-writes?
  • Когда полный CQRS не стоит вводить вовсе?

Разбор темы

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

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

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

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

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