После перехода на отдельное хранилище для чтения пользователи жалуются: сохранённое изменение не сразу видно в списке. Как правильно к этому отнестись?
- Почему после сохранения изменение не видно в списке?
- Как жить с отставанием модели чтения?
Отставание модели чтения — свойство полного CQRS, а не дефект: его закладывают в продукт и интерфейс.
- Оптимистичное обновление на клиенте: показать результат из ответа на команду
- Свои изменения читать из модели записи (read-your-own-writes)
- Явный статус «обрабатывается», ожидание версии проекции
А ещё Синхронное обновление проекции в той же транзакции убивает смысл разделения
Подробно
Модель чтения наполняется асинхронно — по событиям от модели записи. Между подтверждением команды и обновлением проекции проходит время: миллисекунды в норме, секунды и минуты при всплесках или сбоях. Это цена независимого масштабирования и денормализации, и спорить с ней бессмысленно — нужно спроектировать опыт пользователя.
Приёмы:
- оптимистичное обновление — клиент сразу показывает сохранённое из ответа на команду, не перечитывая список;
- read-your-own-writes — собственные недавние изменения пользователя читать из модели записи или подмешивать к результату проекции;
- ожидание версии — команда возвращает версию (позицию события), а запрос на чтение ждёт, пока проекция её догонит (с таймаутом);
- честная индикация — «заказ обрабатывается», «изменения появятся через несколько секунд».
Что не делать: обновлять проекцию синхронно в транзакции команды — тогда модели снова связаны, и выгода разделения теряется.
Эксплуатация: отставание проекции — обязательная метрика с алертом; при росте — масштабировать потребителей, искать медленную обработку.
Что хотят услышать
- Понимание, что отставание — встроенное свойство.
- Конкретные приёмы в интерфейсе и API.
- Почему синхронное обновление проекции — плохая идея.
- Мониторинг отставания.
Частые ошибки
- Объявлять это багом и делать синхронную проекцию.
- Не мерить отставание.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Это свойство схемы; его закладывают в UX: оптимистичное обновление, чтение своих записей
- ✗Нужно вернуться к единой модели — CQRS здесь неприменим
- ✗Достаточно чаще опрашивать проекцию на клиенте
- ✗Это баг синхронизации: проекцию надо обновлять синхронно в той же транзакции
Что спросят дальше
- Что такое read-your-own-writes?
- Когда полный CQRS не стоит вводить вовсе?
Разбор темы
- CQRS и Event Sourcing
Разделение моделей чтения и записи, цена рассинхронизации, событие как источник истины, снапшоты и версионирование событий, и честный ответ на вопрос «когда это не нужно».
Связанные вопросы
- Что означает CQRS? Middle
- Пользователь сохранил изменения, обновил страницу — а изменений нет. Что происходит и как это исправить? Middle
- Пользователь публикует комментарий и должен сразу видеть его в ленте, а остальным допустима задержка в несколько секунд. Какие гарантии согласованности вы заложите и как это реализуете? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.