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

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

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

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

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

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

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

Подробно

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

Приёмы:

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

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

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

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

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

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

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