Как сделать offline-first приложение
Вопрос
Как вы спроектируете мобильное приложение, которое полноценно работает без сети?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Локальная база как единственный источник правды для UI
Чтение: показать кеш сразу, обновить из сети фоном
Запись: локально и в outbox, оптимистичный UI
Синхронизатор: системный планировщик, ретраи, идемпотентность
Дельта-синхронизация с курсором и удалениями
Конфликты и статус синхронизации для пользователя
Что могут спросить следом
- Что делать, если outbox вырос до тысяч операций?
- Как мигрировать схему базы с неотправленными изменениями?
Разбор
Основа: локальная база как единственный источник правды. Экраны подписаны на неё, а сеть только обновляет базу. На чтение показываю то, что есть, и параллельно запрашиваю свежие данные с курсором синхронизации, сервер отдаёт изменения и удаления. На запись меняю базу сразу, чтобы UI отреагировал мгновенно, и в той же транзакции кладу операцию в outbox с ключом идемпотентности. Синхронизатор запускается системным планировщиком (WorkManager, BGTaskScheduler), при старте приложения и при появлении сети, отправляет операции по порядку с экспоненциальной задержкой. Конфликты решаю по типу данных: версии записи и ответ 409, слияние по полям, где-то побеждает сервер. Пользователю показываю статус: что ещё не отправлено и что не удалось.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.