Offline-first и синхронизация
Вопрос
Как бы ты сделал приложение заметок, которое работает без интернета и синхронизируется с сервером?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Room как единый источник правды, UI читает только из базы
Изменения пользователя сразу в базу с флагом несинхронизировано
Синхронизация через WorkManager с ограничением на сеть и повторами
Стратегия конфликтов: версии, время изменения, last write wins или слияние
Удаление через пометку (tombstone), а не физически
Идемпотентные запросы и клиентские id
Что могут спросить следом
- Как решать конфликт, если заметку изменили на двух устройствах?
- Как синхронизировать только изменения?
Разбор
Источником правды делаю Room: экран всегда читает из базы, поэтому работает мгновенно и без сети. Любое изменение пользователя сразу пишу в базу с пометкой «не синхронизировано» и временем изменения. Синхронизацию запускаю через WorkManager с ограничением «есть сеть» и экспоненциальными повторами: работа выполнится даже после перезапуска приложения. Воркер отправляет локальные изменения, затем забирает с сервера всё, что изменилось после последней метки синхронизации, и записывает в базу. Удаление делаю мягким, пометкой, иначе сервер не узнает, что запись удалили. Идентификаторы генерирую на клиенте (UUID), чтобы повторная отправка не создавала дубли. Для конфликтов нужна явная стратегия: простейшая «последняя запись побеждает» по времени, надёжнее версии на сервере, а для текста можно сохранять обе версии и предложить пользователю выбрать.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.