KIPRIassistant

Офлайн-first: почему приложение обязано работать без интернета

Что означает офлайн-first на практике, чем локальная запись отличается от кеша, как решаются конфликты синхронизации и почему интерфейс никогда не должен ждать сеть.


“Работает офлайн” пишут почти все, а проверяется это за десять секунд: включите авиарежим и попробуйте создать запись. Если крутится спиннер или появляется ошибка, значит приложение не офлайн-first, оно просто кеширует прочитанное.

Локальная запись против кеша

Разница в направлении данных.

Кеш сохраняет то, что уже пришло с сервера, чтобы показать это без сети. Читать можно, а писать нельзя. Новая запись уходит в сеть, и без неё её просто не существует.

Офлайн-first переворачивает порядок. Источником истины становится база на устройстве. Запись создаётся локально и сразу считается настоящей, получает пометку “ещё не отправлена” и встаёт в очередь синхронизации. Появится сеть, и очередь уедет сама. Не появится сегодня, уедет завтра, и до тех пор ничего не потеряно.

Практическое следствие: интерфейс никогда не ждёт сервер. Нет состояния “сохраняем…”, нет заблокированной кнопки, нет разницы между метро и домом.

Что происходит, когда сеть возвращается

Здесь начинается самое сложное. Именно из-за этой части офлайн-first делают не все.

Пока устройство было офлайн, ту же запись могли поменять на другом устройстве. Наивное “кто последний записал, тот и прав” приводит к тихой потере правок: телефон, пролежавший в кармане неделю, приходит со старой версией и затирает свежую.

Поэтому у каждой записи есть версия и время изменения, а решение о применении принимает сервер: приходящая правка со старой версией отклоняется, а клиент помечает запись как конфликтную и сохраняет свою версию до тех пор, пока человек не решит, какая верна. Это медленнее в разработке и честнее по результату.

Удаление живёт по своим правилам

Удалённая запись не исчезает сразу, а превращается в надгробие, то есть пометку “удалено, время такое-то”. Без неё второе устройство никогда не узнает об удалении и вернёт запись обратно при следующей синхронизации.

Но надгробия нельзя копить вечно: они занимают место на сервере и у всех пользователей сразу. Разумный компромисс состоит в том, чтобы хранить их около месяца, а затем физически чистить. Устройство, которое не выходило на связь дольше, при подключении делает полную сверку списков вместо инкрементальной.

Как это выглядит в KIPRI

Каждая запись сохраняется в локальную базу устройства мгновенно и попадает в очередь синхронизации. Фоновый планировщик следит за сетью и состоянием приложения и отправляет очередь, когда это возможно. Конфликты решаются по версиям, а не по времени прихода. Приложение работает и вовсе без аккаунта, тогда данные просто остаются на устройстве.

Проверить всё это можно тем же способом: включите авиарежим и попробуйте пожить день. Разницы вы не заметите, в этом и смысл.

Статья помогла?

Все записи

Забирайте Кипри себе

На бесплатном тарифе работает всё приложение целиком. Ограничения начинаются там, где начинается серьёзный объём.

Новости и промокоды выходят в Telegram-канале