Поделиться через


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

Заметка

Этот продукт отставлен. Сведения о замене проектов с помощью .NET 8 или более поздней версии см. вбиблиотеке Community Toolkit Datasync.

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

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

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

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

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

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

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

Локальное хранилище — это уровень сохраняемости данных на клиентском устройстве. Большинство платформ используют SQLite для локального хранилища, но iOS использует основные данные. Вы также можете реализовать собственное локальное хранилище. Например, используйте версию 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-запрос для этой таблицы. Эта отправка помогает свести к минимуму конфликты между изменениями, которые уже включены в очередь и новые данные с сервера. При необходимости можно настроить отправку всех таблиц, задав PushOtherTables в PullOptions:

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 });

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