Çevrimdışı veri eşitleme

Çevrimdışı veri eşitleme, Azure Mobile Apps'in bir SDK özelliğidir. Veriler yerel bir depoda depolanır. Uygulamanız çevrimdışı olduğunda da verileri oluşturabilir, değiştirebilir ve arayabilirsiniz. Cihazınız çevrimiçi olduğunda veriler Azure Mobile Apps hizmetinizle eşitlenir. SDK, hem istemcide hem de hizmette aynı kayıt değiştirildiğinde çakışma çözümünü destekler.

Çevrimdışı eşitlemenin çeşitli avantajları vardır:

  • Uygulama yanıt hızını artırır
  • Hatalı ağ bağlantısı olduğunda uygulama güvenilirliğini artırır
  • Yüksek gecikme süreli veya tarifeli ağlarda ağ kullanımını sınırlar
  • Bağlantısız kullanımı destekler

Aşağıdaki öğreticilerde, Azure Mobile Apps kullanarak mobil istemcilerinize çevrimdışı eşitleme ekleme adımları gösterilmektedir:

Eşitleme tablosu nedir?

Azure Mobile Apps SDK'ları, IRemoteTable<T>hizmete doğrudan erişen sağlar. Cihazın ağ bağlantısı yoksa işlem başarısız olur. Eşitleme tablosu (tarafından IOfflineTable<T>sağlanan), yerel bir depoda aynı işlemleri sağlar. Yerel depo daha sonra hizmetle eşitlenebilir. Herhangi bir işlemi gerçekleştirmeden önce yerel depoyu başlatmanız gerekir.

Yerel mağaza nedir?

Yerel depo, istemci cihazındaki veri kalıcılığı katmanıdır. Çoğu platformda yerel depo için SQLite kullanılır, ancak iOS Temel Verileri kullanır. Kendi yerel deponuzu da uygulayabilirsiniz. Örneğin, şifrelenmiş bir depo oluşturmak için SQLCipher ile SQLite sürümünü kullanın.

Çevrimdışı eşitleme nasıl çalışır?

İstemci kodunuz, yerel değişikliklerin bir veri eşitleme hizmetiyle ne zaman eşitleneceğini denetler. Yerel değişiklikleri göndermediğiniz sürece hizmete hiçbir şey gönderilmez. Benzer şekilde, yerel depo yalnızca veri çektiğiniz zaman yeni veya güncelleştirilmiş verilerle doldurulur.

Tüm tablolar, tablo listesi veya bir tablo için bekleyen işlemleri gönderebilirsiniz:

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

Eşitleme

Gönderme işlemi, işlem kuyruğundaki bekleyen tüm değişiklikleri hizmete gönderir. Bekleyen değişiklik, bir HTTP REST çağrısı aracılığıyla hizmete gönderilir ve bu da veritabanınızı değiştirir.

Gönderme işlemleri herhangi bir çekme işlemi öncesinde yapılır. Çekme işlemi, değiştirilen verileri hizmetten çeker ve yerel depoda depolar.

Örtük gönderme

Bekleyen yerel güncelleştirmeleri olan bir tabloda çekme işlemini yürütürseniz, çekme ilk olarak bu tablo için bir gönderim yürütür. Bu gönderme, zaten kuyruğa alınmış değişikliklerle sunucudan gelen yeni veriler arasındaki çakışmaları en aza indirmeye yardımcı olur. İsteğe bağlı olarak içinde ayarlayarak PushOtherTablesPullOptionstüm tabloların gönderimini yapılandırabilirsiniz:

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

Kayıtların bir alt kümesini çekme

İsteğe bağlı olarak, çevrimdışı veritabanına hangi kayıtların dahil edilmesi gerektiğini belirlemek için kullanılan bir sorgu belirtebilirsiniz. Örneğin:

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

Artımlı eşitleme

Azure Mobile Apps artımlı eşitleme uygular. Yalnızca son çekme işleminden sonra değişen kayıtlar çekilir. Artımlı eşitleme, büyük tabloları işlerken zamandan ve bant genişliğinden tasarruf sağlar.

Her benzersiz sorgu için UpdatedAt , başarıyla aktarılan son kaydın alanı çevrimdışı depoda belirteç olarak depolanır. Son UpdatedAt değer delta belirteci deposunda depolanır. Delta belirteci deposu, çevrimdışı depoda bir tablo olarak uygulanır.

Performans ve tutarlılık

Eşitleme bazen erken durur. Örneğin:

  • Eşitleme için kullandığınız ağ, eşitleme işlemi sırasında kullanılamaz duruma gelir.
  • Eşitleme sırasında uygulamayı zorla kapatırsınız.

Çevrimdışı veritabanında bir tutarlılık sorunu riskini en aza indirmek için, her kayıt alınan veritabanına yazılır. İsteğe bağlı olarak kayıtları toplu olarak veritabanına yazmaya karar vekleyebilirsiniz. Toplu işlemler, çekme işlemi sırasında çevrimdışı veritabanı yazma işlemlerinin performansını artırır. Ancak, tablo meta verileriyle tablo içindeki veriler arasında tutarsızlık riskini de artırır.

Yazma işlemleri arasındaki aralığı aşağıdaki gibi ayarlayabilirsiniz:

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

Bu kod, yazma işlemlerini 25 kayıtlık toplu işlemler halinde toplar. Performans testi, performansın 25'e kadar arttığını gösterir. WriteDeltaTokenInterval 25'ten büyük bir değer performansı önemli ölçüde iyileştirmez.

Temizleme

kullanarak IOfflineTable<T>.PurgeItemsAsyncyerel deponun içeriğini temizleyebilirsiniz. İstemci veritabanında eski verileriniz varsa veya bekleyen tüm değişiklikleri atmak istiyorsanız temizleme gerekebilir. Temizleme işlemi, tabloyu yerel depodan temizler. Tabloyu temizlemek için:

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

PurgeItemsAsync() tabloda bekleyen değişiklikler varsa yöntemi bir InvalidOperationException hata oluşturur. Bu durumda, temizleme işleminin gerçekleşmesini zorlayabilirsiniz:

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

Temizleme, çevrimdışı depodaki bir tabloyu temizlemek için son çaredir, çünkü önbellekteki tüm kayıtları siler ve bunları yeniden indirmenizi gerektirir.