Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu düzen, isteğe bağlı verileri bir veri deposundan önbelleğe yükler. Performansı geliştirmek ve önbellekteki veriler ile temel alınan veri deposundaki veriler arasında tutarlılık sağlamaya yardımcı olmak için bu düzeni kullanın.
Bağlam ve sorun
Uygulamalar, bir veri deposundaki bilgilere yinelenen erişim performansını artırmak için önbellek kullanır. Ancak önbelleğe alınan veriler her zaman veri deposuyla tutarlı kalamaz. Uygulamalar, verileri önbellekte mümkün olduğunca up-to-date olarak tutan bir strateji uygulamalıdır. Strateji ayrıca önbelleğe alınan verilerin ne zaman eski olduğunu algılamalı ve uygun şekilde işlemelidir.
Çözüm
Birçok ticari önbelleğe alma sistemi, okuma ve yazma veya arka planda yazma işlemleri sağlar. Bu sistemlerde uygulama, verileri önbelleğe başvurarak alır. Veriler önbellekte değilse, uygulama verileri veri deposundan alır ve önbelleğe ekler. Sistem, önbelleğe alınan verilerde yapılan değişiklikleri otomatik olarak veri deposuna yazar.
Bu işlevi sağlamayan önbellekler için, önbelleği kullanan uygulamaların verileri tutması gerekir.
Bir uygulama, Cache-Aside desenini uygulayarak okuma önbelleği işlevselliğini öykünebilir. Bu strateji, verileri isteğe bağlı olarak önbelleğe yükler. Aşağıdaki diyagram verileri önbellekte depolamak için Cache-Aside desenini kullanır.
Uygulama, önbellekten okumaya çalışarak bir öğenin şu anda önbellekte olup olmadığını belirler.
Öğe önbellekte değilse ( önbellek kaçırma olarak da bilinir) uygulama öğeyi veri deposundan alır.
Uygulama, öğeyi önbelleğe ekler ve ardından çağırana döndürür.
Bir uygulama bilgileri güncelleştirirse, veri deposunda değişiklik yaparak ve önbellekteki ilgili öğeyi geçersiz kılarak yazma stratejisini izleyebilir.
Öğe yeniden gerektiğinde, Cache-Aside deseni güncelleştirilmiş verileri veri deposundan alır ve önbelleğe ekler.
Sorunlar ve dikkat edilmesi gerekenler
Bu düzenin nasıl uygulaneceğine karar velarken aşağıdaki noktaları göz önünde bulundurun:
Önbelleğe alınan verilerin ömrü: Birçok önbellek, belirli bir süre boyunca erişilmiyorsa verileri geçersiz kılıp önbellekten kaldırmak için bir süre sonu ilkesi kullanır. Cache-aside modelini etkili hale getirmek için, geçerlilik süresi politikasının verileri kullanan uygulamaların erişim düzeniyle eşleştiğinden emin olun. Uygulamaların veri deposundan sürekli veri almasına ve önbelleğe eklemesine neden olabileceğinden, süre sonu süresini çok kısa yapmayın. Benzer şekilde, süre sonu süresini önbelleğe alınan verilerin eskimesi için uzun yapmayın. Önbelleğe alma, uygulamaların sıklıkla okuduğu görece statik veriler veya veriler için en iyi sonucu sağlar.
Veri çıkarma: Çoğu önbellek, verilerin kaynaklandığı veri deposuyla karşılaştırıldığında sınırlı bir boyuta sahiptir. Önbellek boyut sınırını aşarsa verileri çıkartır. Çoğu önbellek, çıkarma için öğeleri seçmek için en son kullanılan bir ilkeyi benimser, ancak bazıları özelleştirmeye izin verir.
Yapılandırma: Önbellek davranışını genel olarak veya önbelleğe alınan öğe başına yapılandırabilirsiniz. Tek bir genel çıkarma ilkesi tüm öğelere uygun olmayabilir. Bir öğenin alınması pahalıysa, önbellek öğesini ayrı ayrı yapılandırın. Bu durumda, daha ucuz öğelere göre daha az sıklıkta erişildiğinde bile öğeyi önbellekte tutmak mantıklıdır.
Önbelleği hazırlama: Birçok çözüm, bir uygulamanın başlatma işleminin bir parçası olarak gerektirebileceği verilerle önbelleği önceden doldurur. Cache-Aside düzeni, bu verilerin bir bölümünün süresi dolduğunda veya çıkarıldığında yararlı olmaya devam eder.
Tutarlı -lık: Cache-Aside deseni, veri deposu ile önbellek arasında tutarlılık garantisi vermez. Örneğin, dış işlem herhangi bir zamanda veri deposundaki bir öğeyi değiştirebilir. Bu değişiklik, öğe yeniden yüklenene kadar önbellekte görünmez. Verileri veri depoları arasında çoğaltan bir sistemde sık eşitleme, tutarlılığı zorlaştırabilir.
Yerel önbelleğe alma: Önbellek bir uygulama örneğinde yerel olabilir ve bellek içinde depolanabilir. Bir uygulama aynı verilere tekrar tekrar erişiyorsa, edilgen önbellek bu ortamda iyi çalışır. Ancak yerel önbellek özeldir, bu nedenle farklı uygulama örneklerinin her biri aynı önbelleğe alınmış verilerin bir kopyasına sahip olabilir. Bu veriler önbellekler arasında hızla tutarsız hale gelebilir, bu nedenle özel önbellekteki verilerin süresinin dolması ve daha sık yenilenmesi gerekebilir. Bu senaryolarda, paylaşılan veya dağıtılmış bir önbelleğe alma mekanizması kullanmayı göz önünde bulundurun.
Anlamsal önbelleğe alma: Bazı iş yükleri, tam anahtarlar yerine anlamsal anlam temelinde önbellek alma işlemi gerçekleştirmenin avantajlarından yararlanabilir. Bu yaklaşım, dil modellerine gönderilen istek ve belirteç sayısını azaltır. Semantik önbelleğe alma özelliğini yalnızca veriler semantik denkliği desteklediğinde, ilgisiz yanıtlar döndürme riskini almadığında ve özel ve hassas veriler içermediğinde kullanın. Örneğin, "Yıllık ev maaşım nedir?" "Yıllık ev ücretim nedir?" ile benzerdir. Ancak farklı kullanıcılar bu soruları sorarsa, yanıtlar farklı olmalıdır. Ayrıca bu hassas verileri önbelleğinize eklememelisiniz.
Bu düzenin kullanılacağı durumlar
Bu düzeni aşağıdaki durumlarda kullanın:
Bir önbellek doğrudan okuma ve yazma işlemleri sağlamaz.
Kaynak talebi tahmin edilemez. Bu düzen uygulamaların verileri isteğe bağlı olarak yüklemelerini sağlar. Bir uygulamanın önceden hangi verileri gerektirdiğini varsaymaz.
Bu düzen aşağıdaki durumlarda uygun olmayabilir:
Veriler hassas veya güvenlikle ilgili. Özellikle birden çok uygulama veya kullanıcı önbelleği paylaştığında verileri önbellekte depolamak uygun olmayabilir. Bu tür verileri her zaman birincil kaynaktan alın.
Önbelleğe alınan veri kümesi statiktir. Veriler kullanılabilir önbellek alanına sığıyorsa, başlangıçtaki verileri önbelleğe alın ve verilerin süresinin dolmasını engelleyen bir ilke uygulayın.
Çoğu istek önbelleğe isabet etmez. Bu durumda, önbelleği denetleme ve verileri bu önbelleğe yükleme yükü, önbelleğe almanın avantajlarından daha ağır basabilir.
Oturum durumu bilgilerini bir web grubunda barındırılan bir web uygulamasında önbelleğe alırsınız. Bu ortamda, istemci-sunucu benşimini temel alan bağımlılıkları tanıtmaktan kaçının.
İş yükü tasarımı
Azure Well-Architected Framework yapılarında ele alınan hedefleri ve ilkeleri ele almak için bir iş yükünün tasarımında Cache-Aside deseninin nasıl kullanılacağını değerlendirin. Aşağıdaki tabloda, bu desenin her bir sütunun hedeflerini nasıl desteklediği hakkında rehberlik sağlanmaktadır.
| Sütun | Bu desen sütun hedeflerini nasıl destekler? |
|---|---|
| Güvenilirlik tasarımı kararları, iş yükünüzün hatalı çalışmaya dayanıklı olmasına ve bir hata oluştuktan sonra tamamen çalışır duruma geldiğinden emin olmasına yardımcı olur. | Önbelleğe alma verileri çoğaltır. Kaynak veri deposu geçici olarak kullanılamaz duruma gelirse, sınırlı yollarla sık erişilen verilerin kullanılabilirliğini koruyabilir. Önbellek arızalanırsa iş yükü kaynak veri deposuna geri dönebilir. - RE:05 Yedeklilik |
| Performans Verimliliği , ölçeklendirme, veri ve kod iyileştirmeleri aracılığıyla iş yükünüzün talepleri verimli bir şekilde karşılamasını sağlar. | Önbelleğe alma, seyrek değişen ve bazı eskime durumlarını tolere eden yoğun okunan veriler için performansı artırır. - PE:08 Veri performansı - PE:12 Sürekli performans iyileştirme |
Bu model bir sütun içinde dengeleri ortaya çıkartıyorsa, bunları diğer sütunların hedeflerine karşı değerlendirin.
Örnek
Birden çok uygulama örneğinin paylaşabileceği dağıtılmış bir önbellek oluşturmak için Azure Yönetilen Redis'i kullanmayı göz önünde bulundurun.
Aşağıdaki örnek, .NET için yazılmış bir Redis istemci kitaplığı olan StackExchange.Redis istemcisini kullanır. Azure Yönetilen Redis örneğine bağlanmak için statik ConnectionMultiplexer.Connect yöntemi çağırın ve bağlantı dizesini geçirin. Bu yöntem, bağlantıyı temsil eden bir ConnectionMultiplexer döndürür.
Uygulamanızdaki bir ConnectionMultiplexer örneği paylaşmanın bir yolu, aşağıdaki örneğe benzer şekilde bağlantılı bir örnek döndüren statik bir özelliğe sahip olmaktır. Bu yaklaşım yalnızca tek bir bağlı örneği başlatmak için iş parçacığı güvenli bir yol sağlar.
private static ConnectionMultiplexer Connection;
// Redis connection string information
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
string cacheConnection = ConfigurationManager.AppSettings["CacheConnection"].ToString();
return ConnectionMultiplexer.Connect(cacheConnection);
});
public static ConnectionMultiplexer Connection => lazyConnection.Value;
Aşağıdaki örnekteki GetMyEntityAsync metod, Cache-Aside deseninin bir uygulamasını gösterir. Bu yöntem, okuma geçişi yaklaşımını kullanarak önbellekten bir nesne alır.
yöntemi, anahtar olarak bir tamsayı kimliği kullanarak bir nesneyi tanımlar. Bu anahtarı kullanarak önbellekten bir öğe almaya çalışır. Önbellek eşleşen bir öğe içeriyorsa, öğeyi döndürür. Önbellek eşleşme içermiyorsa, GetMyEntityAsync yöntemi nesneyi bir veri deposundan alır, önbelleğe ekler ve sonra döndürür. Bu örnek, veri deposundaki verileri okuyan kodu atlar çünkü bu mantık veri deposuna bağlıdır. Önbelleğe alınan öğenin süresi, başka bir hizmet veya işlem tarafından güncelleştirildiğinde eskimesini önlemek için yapılandırılır.
// Set five minute expiration as a default
private const double DefaultExpirationTimeInMinutes = 5.0;
public async Task<MyEntity> GetMyEntityAsync(int id)
{
// Define a unique key for this method and its parameters.
var key = $"MyEntity:{id}";
var cache = Connection.GetDatabase();
// Try to get the entity from the cache.
var json = await cache.StringGetAsync(key).ConfigureAwait(false);
var value = string.IsNullOrWhiteSpace(json)
? default(MyEntity)
: JsonConvert.DeserializeObject<MyEntity>(json);
if (value == null) // Cache miss
{
// If there's a cache miss, get the entity from the original store and cache it.
// Code has been omitted because it is data store dependent.
value = ...;
// Avoid caching a null value.
if (value != null)
{
// Put the item in the cache with a custom expiration time that
// depends on how critical it is to have stale data.
await cache.StringSetAsync(key, JsonConvert.SerializeObject(value)).ConfigureAwait(false);
await cache.KeyExpireAsync(key, TimeSpan.FromMinutes(DefaultExpirationTimeInMinutes)).ConfigureAwait(false);
}
}
return value;
}
Not
Örneklerde depoya erişmek ve önbellekten bilgi almak için Azure Managed Redis kullanılır. Daha fazla bilgi için bkz. Azure Yönetilen Redis örneği oluşturma ve .NET Core'da Azure Yönetilen Redis'i kullanma.
Aşağıdaki UpdateEntityAsync yöntem, uygulama değeri değiştirdiğinde önbellekteki bir nesnenin nasıl geçersiz kılınduğunu gösterir. Bu kod özgün veri deposunu güncelleştirir ve sonra önbelleğe alınan öğeyi önbellekten kaldırır.
public async Task UpdateEntityAsync(MyEntity entity)
{
// Update the object in the original data store.
await this.store.UpdateEntityAsync(entity).ConfigureAwait(false);
// Invalidate the current cache object.
var cache = Connection.GetDatabase();
var id = entity.Id;
var key = $"MyEntity:{id}"; // The key for the cached object.
await cache.KeyDeleteAsync(key).ConfigureAwait(false); // Delete this key from the cache.
}
Not
Adımların sırası önemlidir. Öğeyi önbellekten kaldırmadan önce veri deposunu güncelleştirin. Önce önbelleğe alınan öğeyi kaldırırsanız, istemcinin veri deposu güncelleştirilmeden önce öğeyi getirebileceği küçük bir zaman penceresi vardır. Bu durumda, öğe önbellekte olmadığından getirme işleminin önbellekte eksik olmasına neden olur. Önbellek hatası, uygulamanın veri deposundan eski öğeyi almasına ve önbelleğe geri eklemesine neden olur. Bu dizi önbellekte eski verilere yol açar.
Sonraki Adımlar
Veri tutarlılığı temel bilgileri: Bu temel, dağıtılmış veriler arasında tutarlılık ile ilgili sorunları açıklar. Ayrıca bir uygulamanın verilerin kullanılabilirliğini korumak için nihai tutarlılığı nasıl uygulayabileceğini de özetler. Bulut uygulamaları genellikle verileri birden çok veri deposunda ve konumda depolar. Özellikle ortaya çıkabilecek eşzamanlılık ve kullanılabilirlik sorunları nedeniyle bu ortamda veri tutarlılığını verimli bir şekilde yönetmeniz ve korumanız gerekir.
Azure Yönetilen Redis'i anlamsal önbellek olarak kullanma: Bu öğreticide, Azure Managed Redis kullanarak anlamsal önbelleğe alma işleminin nasıl uygulandığı gösterilmektedir.
İlgili kaynaklar
Güvenilir Web Uygulaması düzeni: Bu desen, buluttaki web uygulamalarına Cache-Aside desenini uygular.
Önbelleğe alma kılavuzu: Bu kılavuz, bir bulut çözümünde verileri önbelleğe alma hakkında daha fazla bilgi ve önbellek uygularken göz önünde bulundurmanız gereken sorunlar sağlar.