Синхронизация автономных данных

Автономная синхронизация данных — это функция пакета SDK для мобильных приложений Azure. Данные хранятся в локальном хранилище. Если приложение находится в автономном режиме, вы по-прежнему можете создавать, изменять и искать данные. Данные синхронизируются с вашей службой мобильных приложений Azure, когда устройство подключено к Интернету. Пакет SDK поддерживает разрешение конфликтов, если одна и та же запись изменяется как на клиенте, так и в службе.

Автономная синхронизация имеет несколько преимуществ.

  • Улучшает скорость отклика приложения
  • Повышает надежность приложений при плохом сетевом подключении
  • Ограничивает использование сети в сетях с высокой задержкой или лимитом
  • Поддерживает отключенное использование

В следующих руководствах показано, как добавить автономную синхронизацию для мобильных клиентов с помощью мобильных приложений Azure:

Что такое таблица синхронизации?

Пакеты SDK для мобильных приложений Azure предоставляют IRemoteTable<T>, которые напрямую обращаются к службе. Операция завершается ошибкой, если устройство не имеет сетевого подключения. Таблица синхронизации (предоставленаIOfflineTable<T>) предоставляет те же операции с локальным хранилищем. Локальное хранилище можно синхронизировать со службой позже. Перед выполнением любых операций необходимо инициализировать локальное хранилище.

Что такое локальное хранилище?

Локальное хранилище — это уровень сохраняемости данных на клиентском устройстве. Большинство платформ используют SQLite для локального хранилища, но iOS использует Core Data. Кроме того, можно реализовать собственное локальное хранилище. Например, используйте версию SQLite с SQLCipher для создания зашифрованного хранилища.

Как работает автономная синхронизация?

Клиентский код управляет синхронизацией локальных изменений со службой синхронизации данных. Ничего не отправляется в службу, пока не отправляется локальные изменения. Аналогичным образом локальное хранилище заполняется новыми или обновленными данными только при извлечении данных.

Вы можете отправлять ожидающие операции для всех таблиц, списка таблиц или одной таблицы:

// All tables
await client.PushTablesAsync();

// A list of tables
var tablesToPush = new string[] { "table1", "table2" };
await client.PushTablesAsync(tablesToPush);

// A single table
await table.PushItemsAsync();

Синхронизация

При выполнении операции отправки все ожидающие изменения отправляются в очередь операций службы. Ожидающее изменение отправляется службе через вызов REST HTTP, который, в свою очередь, изменяет базу данных.

Все операции отправки выполняются до любых операций извлечения. При выполнении операции извлечения измененные данные извлекаются из службы и сохраняются в локальном хранилище.

Неявная отправка

Если вы выполняете вытягивание для таблицы, которая ожидает локальных обновлений, вытягивание сначала выполняет push-запрос для этой таблицы. Это позволяет свести к минимуму конфликты между изменениями, которые уже поставлены в очередь, и новыми данными с сервера. При необходимости можно настроить отправку всех таблиц, установив в PullOptionsследующих параметрахPushOtherTables:

var pullOptions = new PullOptions { PushOtherTables = true };
await table.PullItemsAsync(pullOptions);

Извлечение подмножества записей

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

var query = table.CreateQuery().Where(x => x.Color == "Blue");
await table.PullItemsAsync(query);

Добавочная синхронизация

Мобильные приложения Azure реализуют добавочную синхронизацию. Извлекаются только записи, которые изменились с момента последней операции извлечения. Добавочная синхронизация экономит время и пропускную способность при обработке больших таблиц.

Для каждого уникального запроса UpdatedAt поле последней успешно переданной записи хранится в виде токена в автономном хранилище. Последнее UpdatedAt значение хранится в хранилище разностных токенов. Хранилище разностных маркеров реализуется в виде таблицы в автономном хранилище.

Производительность и согласованность

Синхронизация иногда останавливается преждевременно. Например:

  • Сеть, используемая для синхронизации, становится недоступной во время процесса синхронизации.
  • При принудительном закрытии приложения во время синхронизации.

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

Интервал между записью можно настроить следующим образом:

var pullOptions = new PullOptions { WriteDeltaTokenInterval = 25 };
await table.PullItemsAsync(pullOptions);

Этот код собирает записи в пакеты из 25 записей. Тестирование производительности предполагает, что производительность улучшается до 25. WriteDeltaTokenInterval Значение больше 25 не значительно повышает производительность.

Очистка

Содержимое локального хранилища можно очистить с помощью IOfflineTable<T>.PurgeItemsAsync. Очистка может потребоваться, если у вас есть устаревшие данные в клиентской базе данных или если вы хотите отключать карта все ожидающие изменения. Данная операция очищает таблицу в локальном хранилище. Чтобы очистить таблицу, выполните следующее:

await table.PurgeItemsAsync("", new PurgeOptions());

Метод PurgeItemsAsync() выдает ошибку InvalidOperationException при наличии ожидающих изменений в таблице. В этом случае можно принудительно выполнить очистку:

await table.PurgeItemsAsync("", new PurgeOptions { DiscardPendingOperations = true });

Очистка является последним средством для очистки таблицы в автономном хранилище, так как она очищает все записи из кэша и требует повторно скачать их.