Ответ вслух Senior Room и хранение данных обновлено

Offline-first и синхронизация

Вопрос

Как бы ты сделал приложение заметок, которое работает без интернета и синхронизируется с сервером?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Источником правды делаю Room: экран всегда читает из базы, поэтому работает мгновенно и без сети. Любое изменение пользователя сразу пишу в базу с пометкой «не синхронизировано» и временем изменения.

Что должно прозвучать в ответе

  • Room как единый источник правды, UI читает только из базы

  • Изменения пользователя сразу в базу с флагом несинхронизировано

  • Синхронизация через WorkManager с ограничением на сеть и повторами

  • Стратегия конфликтов: версии, время изменения, last write wins или слияние

  • Удаление через пометку (tombstone), а не физически

  • Идемпотентные запросы и клиентские id

Что могут спросить следом

  • Как решать конфликт, если заметку изменили на двух устройствах?
  • Как синхронизировать только изменения?

Разбор

Источником правды делаю Room: экран всегда читает из базы, поэтому работает мгновенно и без сети. Любое изменение пользователя сразу пишу в базу с пометкой «не синхронизировано» и временем изменения. Синхронизацию запускаю через WorkManager с ограничением «есть сеть» и экспоненциальными повторами: работа выполнится даже после перезапуска приложения. Воркер отправляет локальные изменения, затем забирает с сервера всё, что изменилось после последней метки синхронизации, и записывает в базу. Удаление делаю мягким, пометкой, иначе сервер не узнает, что запись удалили. Идентификаторы генерирую на клиенте (UUID), чтобы повторная отправка не создавала дубли. Для конфликтов нужна явная стратегия: простейшая «последняя запись побеждает» по времени, надёжнее версии на сервере, а для текста можно сохранять обе версии и предложить пользователю выбрать.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.