Synchronizace dat offline

Offline synchronizace dat je funkce sady SDK služby Azure Mobile Apps. Data se ukládají v místním úložišti. Když je vaše aplikace offline, můžete dál vytvářet, upravovat a prohledávat data. Data se synchronizují se službou Azure Mobile Apps, když je vaše zařízení online. Sada SDK podporuje řešení konfliktů při změně stejného záznamu v klientovi i službě.

Offline synchronizace má několik výhod:

  • Zlepšuje odezvu aplikace.
  • Zvyšuje spolehlivost aplikací v případech, kdy dochází k špatnému síťovému připojení.
  • Omezení využití sítě v sítích s vysokou latencí nebo měřenými sítěmi
  • Podporuje odpojené použití.

Následující kurzy ukazují, jak přidat offline synchronizaci do mobilních klientů pomocí Azure Mobile Apps:

Co je synchronizační tabulka?

Sady AZURE Mobile Apps SDK poskytují IRemoteTable<T>, které k této službě přistupuje přímo. Operace selže, pokud zařízení nemá síťové připojení. Synchronizační tabulka (poskytovaná IOfflineTable<T>) poskytuje stejné operace s místním úložištěm. Místní úložiště je pak možné synchronizovat se službou později. Před provedením jakýchkoli operací je nutné inicializovat místní úložiště.

Co je místní úložiště?

Místní úložiště je vrstva trvalosti dat na klientském zařízení. Většina platforem používá pro místní úložiště SQLite, ale iOS používá základní data. Můžete také implementovat vlastní místní úložiště. Například k vytvoření šifrovaného úložiště použijte verzi SQLite s sqlCipherem.

Jak funguje offline synchronizace?

Klientský kód řídí, kdy se místní změny synchronizují se službou synchronizace dat. Do služby se nic neposílají, dokud nenasdílíte místní změny. Podobně se místní úložiště naplní novými nebo aktualizovanými daty pouze při načítání dat.

Můžete odeslat čekající operace pro všechny tabulky, seznam tabulek nebo jednu tabulku:

// 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();

Synchronizace

Operace nabízení odešle do služby všechny čekající změny ve frontě operací. Čekající změna se odešle do služby prostřednictvím volání HTTP REST, které zase upraví vaši databázi.

Operace nabízení se provádějí před všemi operacemi vyžádání. Operace vyžádání změn načítá změněná data ze služby a uloží je v místním úložišti.

Implicitní nasdílení změn

Pokud provedete přijetí změn proti tabulce, která obsahuje čekající místní aktualizace, provede přijetí změn nejprve nabízení pro tuto tabulku. Tato nabízená oznámení pomáhá minimalizovat konflikty mezi změnami, které jsou již zařazeny do fronty, a novými daty ze serveru. Volitelně můžete nakonfigurovat nabízení všech tabulek nastavením PushOtherTables v PullOptions:

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

Vyžádání podmnožina záznamů

Volitelně můžete zadat dotaz, který se použije k určení záznamů, které mají být zahrnuty do offline databáze. Příklad:

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

Přírůstková synchronizace

Azure Mobile Apps implementuje přírůstkovou synchronizaci. Načítají se jenom záznamy, které se změnily od poslední operace vyžádání. Přírůstková synchronizace šetří čas a šířku pásma při zpracování velkých tabulek.

U každého jedinečného dotazu UpdatedAt se pole posledního úspěšně převedeného záznamu uloží jako token v offline úložišti. Poslední UpdatedAt hodnota je uložena v úložišti rozdílových tokenů. Úložiště rozdílových tokenů se implementuje jako tabulka v offline úložišti.

Výkon a konzistence

Synchronizace se někdy předčasně zastaví. Příklad:

  • Síť, kterou používáte pro synchronizaci, se během procesu synchronizace stane nedostupnou.
  • Aplikaci vynutíte při synchronizaci.

Aby se minimalizovalo riziko problému konzistence v offline databázi, každý záznam se zapíše do databáze při přijetí. Volitelně se můžete rozhodnout zapisovat záznamy do databáze v dávkách. Dávkové operace zvyšují výkon zápisů offline databáze během operace vyžádání. Zvyšují ale také riziko nekonzistence mezi metadaty tabulky a daty v tabulce.

Interval mezi zápisy můžete vyladit následujícím způsobem:

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

Tento kód shromažďuje zápisy do dávek 25 záznamů. Testování výkonu naznačuje, že výkon zvyšuje až hodnotu 25. Hodnota WriteDeltaTokenInterval větší než 25 výrazně nezlepší výkon.

Vyprázdnění

Obsah místního úložiště můžete vymazat pomocí .IOfflineTable<T>.PurgeItemsAsync Vymazání může být nezbytné, pokud máte v klientské databázi zastaralá data nebo pokud chcete zahodit všechny čekající změny. Vyprázdnění vymaže tabulku z místního úložiště. Vymazání tabulky:

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

Metoda PurgeItemsAsync() vyvolá InvalidOperationException chybu, pokud jsou v tabulce čekající změny. V takovém případě můžete vynutit, aby se vyprázdnění stalo:

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

Vymazání je posledním místem pro vyčištění tabulky v offline úložišti, protože vymaže všechny záznamy z mezipaměti a vyžaduje, abyste je znovu stáhli.