Dağıtılmış Önbelleğe Alma (Azure ile Cloud Apps Real-World Oluşturma)

tarafından Rick Anderson, Tom Dykstra

Fix It Project'i indirin veya E-kitabı indirin

Azure e-kitabıyla Gerçek Dünya Bulut Uygulamaları Oluşturma, Scott Guthrie tarafından geliştirilen bir sunuyu temel alır. Bulut için web uygulamalarını başarıyla geliştirmenize yardımcı olabilecek 13 desen ve uygulama açıklanmaktadır. E-kitap hakkında bilgi için ilk bölüme bakın.

Önceki bölümde geçici hata işleme konusuna değinildi ve devre kesici stratejisi olarak önbelleğe alma özelliğinden bahsedildi. Bu bölümde önbelleğe alma hakkında ne zaman kullanılacağı, kullanımına yönelik yaygın desenler ve Azure'da nasıl uygulanacakları da dahil olmak üzere daha fazla arka plan sağlanır.

Dağıtılmış önbelleğe alma nedir?

Önbellek, verileri bellekte depolayarak yaygın olarak erişilen uygulama verilerine yüksek aktarım hızı ve düşük gecikme süreli erişim sağlar. Bulut uygulaması için en kullanışlı önbellek türü dağıtılmış önbellektir; bu da verilerin tek tek web sunucusunun belleğinde değil diğer bulut kaynaklarında depolandığı ve önbelleğe alınan verilerin uygulamanın tüm web sunucularında (veya uygulama tarafından kullanılan diğer bulut VM'lerinde) kullanılabilir hale getirildiği anlamına gelir.

aynı önbellek sunucularına erişen birden çok web sunucusunu gösteren diyagram

Uygulama sunucuları ekleyerek veya kaldırarak ölçeklendirildiğinde ya da sunucular yükseltmeler veya hatalar nedeniyle değiştirildiğinde, önbelleğe alınan veriler uygulamayı çalıştıran her sunucu için erişilebilir durumda kalır.

Kalıcı bir veri deposunun yüksek gecikme süreli veri erişiminden kaçınarak önbelleğe alma, uygulama yanıt hızını önemli ölçüde artırabilir. Örneğin, verileri önbellekten almak, ilişkisel veritabanından almaktan çok daha hızlıdır.

Önbelleğe almanın bir yan avantajı, kalıcı veri deposuna yönelik trafiğin azaltılmasıdır ve kalıcı veri deposu için veri çıkışı ücretleri söz konusu olduğunda maliyetlerin düşmesine neden olabilir.

Dağıtılmış önbelleğe alma ne zaman kullanılır?

Önbelleğe alma, verilerin yazılmasından daha fazla okuma sağlayan uygulama iş yükleri ve veri modeli önbellekte verileri depolamak ve almak için kullandığınız anahtar/değer kuruluşunu desteklediğinde en iyi sonucu verir. Uygulama kullanıcıları çok fazla ortak veri paylaştığında da daha kullanışlıdır; örneğin, her kullanıcı normalde bu kullanıcıya özgü verileri alırsa önbellek bu kadar avantaj sağlamaz. Verilerin sık değişmemesi ve tüm müşterilerin aynı verilere bakması nedeniyle önbelleğe almanın çok yararlı olabileceği bir örnek, ürün kataloğudur.

Kalıcı veri deposunun aktarım hızı sınırları ve gecikme gecikmeleri genel uygulama performansında bir sınıra dönüştüğünden, önbelleğe alma avantajı bir uygulama ölçeklendikçe giderek daha fazla ölçülebilir hale gelir. Ancak, önbelleğe alma işlemini performans dışında başka nedenlerle de uygulayabilirsiniz. Kullanıcıya gösterildiğinde tamamen güncel olması gerekmeyen veriler için önbellek erişimi, kalıcı veri deposunun yanıt vermemesi veya kullanılamaması için devre kesici görevi görebilir.

Önbellekten veri alabilmek için önce orada depolamanız gerekir. Bir önbelleğe ihtiyacınız olan verileri almak için çeşitli stratejiler vardır:

  • İsteğe Bağlı / Edilgen Önbellek

    Uygulama önbellekten veri almaya çalışır ve önbellekte veri olmadığında ("eksik") uygulama verileri önbellekte depolar, böylece bir sonraki sefer kullanılabilir olur. Uygulama aynı verileri almayı bir sonraki denemesinde önbellekte aradığını bulur ("isabet"). Veritabanında değiştirilen önbelleğe alınmış verilerin getirilmesini önlemek için, veri deposunda değişiklik yaparken önbelleği geçersiz kılabilirsiniz.

  • Arka Plan Veri Gönderme

    Arka plan hizmetleri verileri düzenli bir zamanlamaya göre önbelleğe aktarır ve uygulama her zaman önbellekten çeker. Bu yaklaşım, her zaman en son verileri döndürmenizi gerektirmeyen yüksek gecikme süreli veri kaynaklarında harika çalışır.

  • Devre Kesici

    Uygulama normalde kalıcı veri deposuyla doğrudan iletişim kurar, ancak kalıcı veri deposunda kullanılabilirlik sorunları olduğunda uygulama önbellekten veri alır. Veriler, edilgen önbellek veya arka plan veri gönderme stratejisi kullanılarak önbelleğe alınmış olabilir. Bu, performans geliştirme stratejisi yerine hata işleme stratejisidir.

Verileri önbellekte güncel tutmak için, uygulamanız verileri oluşturduğunda, güncelleştirdiğinde veya sildiğinde ilgili önbellek girdilerini silebilirsiniz. Uygulamanızın bazen biraz güncel olmayan verileri alması uygunsa, önbellek verilerinin ne kadar eski olabileceğine ilişkin bir sınır ayarlamak için yapılandırılabilir bir süre sonu süresine güvenebilirsiniz.

Mutlak süre sonu (önbellek öğesi oluşturulduktan sonra geçen süre) veya kayan süre sonu (önbellek öğesine son erişildiğinden bu yana geçen süre) yapılandırabilirsiniz. Verilerin çok eskimesini önlemek için önbellek süre sonu mekanizmasına bağlı olduğunuzda mutlak süre sonu kullanılır. Düzelt uygulamasında eski önbellek öğelerini el ile çıkaracağız ve en güncel verileri önbellekte tutmak için kayan süre sonunu kullanacağız. Seçtiğiniz süre sonu ilkesi ne olursa olsun, önbelleğin bellek sınırına ulaşıldığında önbellek en eski (En Son Kullanılan veya LRU) öğeleri otomatik olarak çıkaracaktır.

Düzelt uygulaması için örnek edilgen önbellek kodu

Aşağıdaki örnek kodda, bir Düzelt görevi alınırken önce önbelleği denetleyeceğiz. Görev önbellekte bulunursa geri veririz; bulunamazsa, veritabanından alır ve önbellekte depolarız. Yöntemine önbelleğe alma eklemek için FindTaskByIdAsync yaptığınız değişiklikler vurgulanır.

public async Task<FixItTask> FindTaskByIdAsync(int id)
 {
    FixItTask fixItTask = null;
    Stopwatch timespan = Stopwatch.StartNew();
    string hitMiss = "Hit";

    try
    {
       fixItTask = (FixItTask)cache.Get(id.ToString());
       if (fixItTask == null)
       {
          fixItTask = await db.FixItTasks.FindAsync(id);
          cache.Put(id.ToString(), fixItTask);
          hitMiss = "Miss";
       }

       timespan.Stop();
       log.TraceApi("SQL Database", "FixItTaskRepository.FindTaskByIdAsync", timespan.Elapsed, 
                    "cache {0}, id={1}", hitMiss, id);
    }
    catch (Exception e)
    {
       log.Error(e, "Error in FixItTaskRepository.FindTaskByIdAsynx(id={0})", id);
    }

    return fixItTask;
 }

Bir Düzelt görevini güncelleştirdiğinizde veya sildiğinizde, önbelleğe alınmış görevi geçersiz kılmanız (kaldırmanız) gerekir. Aksi takdirde, gelecekte bu görevi okumaya yönelik girişimler önbellekten eski verileri almaya devam eder.

public async Task UpdateAsync(FixItTask taskToSave)
{
   Stopwatch timespan = Stopwatch.StartNew();

   try
   {
      cache.Remove(taskToSave.FixItTaskId.ToString());
      db.Entry(taskToSave).State = EntityState.Modified;
      await db.SaveChangesAsync();

      timespan.Stop();
      log.TraceApi("SQL Database", "FixItTaskRepository.UpdateAsync", timespan.Elapsed, "taskToSave={0}", taskToSave);
   }
   catch (Exception e)
   {
      log.Error(e, "Error in FixItTaskRepository.UpdateAsync(taskToSave={0})", taskToSave);
   }
}

Bunlar basit önbelleğe alma kodunu gösteren örneklerdir; önbelleğe alma, indirilebilir Düzelt projesinde uygulanmadı.

Azure önbelleğe alma hizmetleri

Azure aşağıdaki önbelleğe alma hizmetlerini sunar: Azure Redis Cache ve Azure Yönetilen Önbellek. Azure Redis cache popüler açık kaynak Redis Cache'i temel alır ve çoğu önbelleğe alma senaryosu için ilk seçenektir.

Önbellek sağlayıcısı kullanarak oturum durumunu ASP.NET

Web geliştirme en iyi yöntemleri bölümünde belirtildiği gibi, en iyi yöntem oturum durumunu kullanmaktan kaçınmaktır. Uygulamanız oturum durumu gerektiriyorsa, bir sonraki en iyi yöntem, ölçeği genişletmeyi (web sunucusunun birden çok örneği) etkinleştirmediğinden varsayılan bellek içi sağlayıcıyı önlemektir. ASP.NET SQL Server oturum durumu sağlayıcısı, birden çok web sunucusunda çalışan bir sitenin oturum durumunu kullanmasını sağlar, ancak bellek içi sağlayıcıya kıyasla yüksek gecikme süresi maliyetine neden olur. Oturum durumunu kullanmanız gerekiyorsa en iyi çözüm, Azure Önbelleği için Oturum Durumu Sağlayıcısı gibi bir önbellek sağlayıcısı kullanmaktır.

Özet

Yanıt süresini ve ölçeklenebilirliği geliştirmek ve veritabanı kullanılamadığında uygulamanın okuma işlemleri için yanıt vermeye devam edebilmesini sağlamak için Düzelt uygulamasının önbelleğe alma özelliğini nasıl uygulayabileceğini gördünüz. Sonraki bölümde ölçeklenebilirliği nasıl daha da geliştirebileceğimizi ve uygulamanın yazma işlemleri için yanıt vermeye devam etme şeklini göstereceğiz.

Kaynaklar

Önbelleğe alma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Belgeler

Videolar

  • FailSafe: Ölçeklenebilir, Dayanıklı Cloud Services oluşturma. Ulrich Homann, Marc Mercuri ve Mark Simms tarafından 9 bölümlü seri. Bulut uygulamalarının mimarisinin nasıl tasarlandıklarına yönelik 400 düzeyinde bir görünüm sunar. Bu seri teoriye ve nedenlere odaklanır; Daha fazla nasıl yapılır ayrıntıları için bkz. Mark Simms'in Büyük Derleme serisi. 3. bölümde 1:24:14'te başlayan önbelleğe alma tartışmasını görün.
  • Büyük Derleme: Azure müşterilerinden alınan dersler - Bölüm I. Simon Davies, saat 46:00'dan itibaren dağıtılmış önbelleğe almayı ele alır. Failsafe serisine benzer ancak daha fazla nasıl yapılır ayrıntılarına gider. Sunu 31 Ekim 2012'de verildiğinden, 2013'te tanıtılan Azure App Service Web Apps önbelleğe alma hizmetini kapsamaz.

Kod örneği