Конфликты синхронизации между устройствами
Вопрос
Пользователь редактирует одни и те же данные на телефоне и планшете, оба иногда офлайн. Как разрешать конфликты?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Определить тип данных и цену потери изменения
Версионирование записей и оптимистичная блокировка (409 на устаревшую версию)
Слияние по полям вместо перезаписи объекта
Ручное разрешение для важных данных
CRDT для совместного редактирования текста и списков
Не доверять часам устройства
Что могут спросить следом
- Как реализовать слияние по полям?
- Что хранить, чтобы показать пользователю обе версии?
Разбор
Начинаю с вопроса, чем грозит потеря изменения. Для настроек и флагов достаточно last write wins по отдельным полям с серверным временем или версией. Для сущностей вроде задачи у каждой записи есть версия: клиент отправляет изменение с версией, на основе которой его сделал, и если сервер видит более новую, отвечает 409. Тогда клиент скачивает актуальную запись и пытается слить по полям: если менялись разные поля, конфликта нет. Если одно и то же поле, для важных данных показываю пользователю обе версии и даю выбрать. Для совместного редактирования текста и упорядоченных списков беру CRDT, например Automerge или Yjs, они сходятся без арбитра. Часам устройства не доверяю никогда.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.