Veri deposundaki verileri istek üzerine önbelleğe yükleyin. Bunu yapmak, performansı geliştirebilir ve önbellekte tutulan veriler ile temel alınan veri deposundaki veriler arasında tutarlılık sağlamak için de yardımcı olabilir.
Bağlam ve sorun
Uygulamalar, veri deposunda tutulan bilgilere tekrar tekrar erişmeyi geliştirmek için bir önbelleği kullanır. Ancak, önbelleğe alınan verilerin veri deposundaki verilerle her zaman tamamen tutarlı olmasını beklemek zordur. Uygulamalar, önbellekteki verilerin olabildiğince güncel olmasını sağlamaya yardımcı olan ancak aynı zamanda önbellekteki veriler eskidiğinde ortaya çıkan durumları da algılayıp yönetebilecek bir strateji yürütmelidir.
Çözüm
Birçok ticari önbelleğe alma sistemi anında okuma ve anında yazma/arka planda yazma işlemleri sağlar. Bu sistemlerde uygulama, verileri önbelleğe başvurarak alır. Veriler önbellekte değilse veri deposundan alınarak önbelleğe eklenir. Önbellekte tutulan verilere yapılan tüm değişiklikler, ayrıca veri deposuna otomatik olarak geri yazılır.
Bu işlevi sağlamayan önbelleklerde verileri koruma sorumluluğu önbelleği kullanan uygulamalara aittir.
Bir uygulama, edilgen önbellek stratejisini uygulayarak anında okuyan önbellek işlevine öykünebilir. Bu strateji, verileri isteğe bağlı olarak önbelleğe yükler. Şekilde, verileri önbelleğe depolamak için Edilgen Önbellek düzeninin kullanılması gösterilmektedir.
Bir uygulama bilgileri güncelleştirdiğinde veri deposunda değişiklik yaparak ve ilgili öğeyi önbellekte geçersiz kılarak anında yazma stratejisini izleyebilir.
Öğe daha sonra gerekli olduğunda edilgen önbellek stratejisini kullanmak güncelleştirilmiş verilerin veri deposundan alınmasına ve önbelleğe geri eklenmesine neden olur.
Sorunlar ve dikkat edilmesi gerekenler
Bu düzenin nasıl uygulanacağına karar verirken aşağıdaki noktaları göz önünde bulundurun:
Önbelleğe alınan verilerin ömrü. Birçok önbellek, verileri geçersiz kılan ve belirli bir süre boyunca erişilmediğinde önbellekten kaldıran bir süre sonu ilkesi uygular. Edilgen önbelleğin etkili olması için süre sonu ilkesinin verileri kullanan uygulamalara yönelik erişim düzeni ile eşleştiğinden emin olun. Uygulamaların veri deposundan sürekli veri alıp önbelleğe eklemesine neden olabileceği için sona erme süresini çok kısa yapmayın. Benzer şekilde, sona erme süresini önbelleğe alınan verilerin eskimesine yol açabilecek kadar uzun da yapmayın. Önbelleğe almanın göreceli olarak en çok statik veriler veya sık okunan veriler için etkili olduğunu unutmayın.
Verileri çıkarma. Çoğu önbellek, verilerin kaynağı olan veri deposu ile karşılaştırıldığında sınırlı bir boyuta sahiptir ve gerekirse verileri çıkarır. Çoğu önbellekleri çıkarılacak öğeleri seçerken en önce kullanılan ilkesini benimser, ancak bu durum özelleştirilebilir. Önbelleğin uygun maliyetli olduğundan emin olmak için önbelleğin genel sona erme özelliğini, diğer özelliklerini ve önbelleğe alınan her öğenin sona erme özelliğini yapılandırın. Önbellekteki her öğe için genel bir çıkarma ilkesi uygulamak her zaman uygun değildir. Örneğin, önbelleğe alınan bir öğenin veri deposundan alınması çok pahalı ise daha sık erişilen ancak daha az maliyetli öğelerden ödün verme pahasına bu öğeyi önbellekte tutmak yararlı olabilir.
Önbelleği hazırlama. Birçok çözüm, bir uygulamanın başlatma işleminin parçası olarak gerek duyabileceği verileri önceden önbelleğe doldurur. Bu verilerin bir kısmının süresi dolduğunda ya da veriler çıkarıldığında da Edilgen Önbellek düzeni yararlı olmaya devam edebilir.
Tutarlılık. Edilgen Önbellek düzenini uygulamak, veri deposu ile önbellek arasındaki tutarlılığı garanti etmez. Veri deposundaki bir öğe dış işlem tarafından herhangi bir anda değiştirilebilir ve bu değişiklik öğenin bir sonraki yüklenmesine kadar önbelleğe yansıtılmayabilir. Verileri veri depoları arasında çoğaltan bir sistemde, eşitleme sık yapılıyorsa bu sorun önemli hale gelebilir.
Yerel (bellek içi) önbelleğe alma. Önbellek, bir uygulama örneği için yerel olabilir ve bellek içinde saklanabilir. Bir uygulama aynı verilere tekrar tekrar erişiyorsa edilgen önbellek bu ortamda yararlı olabilir. Ancak yerel önbellek özeldir ve bu nedenle, farklı uygulama örneklerinin her biri, önbelleğe alınmış aynı verilerin bir kopyasına sahip olabilir. Bu veriler hızlı bir şekilde önbellekler arasında tutarsız duruma gelebileceğinden özel önbellekte tutulan verilerin bir süre sonu olması ve daha sık yenilenmeleri gerekebilir. Bu senaryolarda, paylaşılan veya dağıtılmış önbelleğe alma mekanizması kullanımını incelemeyi dikkate alın.
Bu düzenin kullanılacağı durumlar
Bu düzeni aşağıdaki durumlarda kullanın:
- Bir önbellek yerel anında okuma ve anında 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 hangi veriye önceden gerek duyacağı hakkında hiçbir varsayım yapmaz.
Bu düzen şu durumda uygun olmayabilir:
- Önbelleğe alınan veri kümesi statik olduğunda. Veriler kullanılabilir önbellek alanına sığıyorsa önbelleği başlangıçta verileriyle hazırlayın ve verilerin süresinin dolmasına engel olan bir ilke uygulayın.
- Web grubunda barındırılan bir web uygulamasındaki oturum durumu bilgilerini önbelleğe alma işleminde. Bu ortamda, istemci-sunucu benzeşimine bağlı olan bağımlılıklar getirmekten kaçınmalısınız.
İş yükü tasarımı
Bir mimar, Azure İyi Tasarlanmış Çerçeve yapılarında ele alınan hedefleri ve ilkeleri ele almak için Cache-Aside düzeninin iş yükünün tasarımında nasıl kullanılabileceğini değerlendirmelidir. Örneğin:
Yapı Taşı | Bu desen sütun hedeflerini nasıl destekler? |
---|---|
Güvenilirlik tasarımı kararları, iş yükünüzün arızaya karşı dayanıklı olmasına ve bir hata oluştuktan sonra tamamen çalışır duruma gelmesini sağlamaya yardımcı olur. | Önbelleğe alma, veri çoğaltması oluşturur ve kaynak veri deposu geçici olarak kullanılamıyorsa sık erişilen verilerin kullanılabilirliğini korumak için sınırlı yollarla kullanılabilir. Ayrıca önbellekte bir arıza varsa 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. | İş yükünüzde daha iyi performans, sık değişmeyen ve iş yükünüz belirli miktarda eskimeye dayanacak şekilde tasarlanmış yoğun okuma içeren veriler için bir önbellek kullanırken elde edilebilir. - PE:08 Veri performansı - PE:12 Sürekli performans iyileştirme |
Herhangi bir tasarım kararında olduğu gibi, bu desenle ortaya konulabilecek diğer sütunların hedeflerine karşı herhangi bir dengeyi göz önünde bulundurun.
Örnek
Microsoft Azure'da Redis için Azure Cache kullanarak bir uygulamanın birden çok örneği tarafından paylaşılabilen dağıtılmış bir önbellek oluşturabilirsiniz.
Aşağıdaki kod örneği, .NET için yazılmış bir Redis istemci kitaplığı olan StackExchange.Redis istemcisini kullanır. Redis için Azure Cache bir örneğe bağlanmak için statik ConnectionMultiplexer.Connect
yöntemi çağırın ve bağlantı dizesi geçirin. Bu yöntem, bağlantıyı temsil eden bir ConnectionMultiplexer
döndürür. Uygulamanızda bir ConnectionMultiplexer
örneği paylaşmaya ilişkin bir yaklaşım, aşağıdaki örneğe benzer bir bağlı örnek döndüren statik ö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;
GetMyEntityAsync
Aşağıdaki kod örneğindeki yöntemi, Cache-Aside düzeninin bir uygulamasını gösterir. Bu yöntem, okuma yaklaşımını kullanarak önbellekten bir nesne alır.
Bir nesne, anahtar olarak bir tamsayı kimliği kullanılarak tanımlanır. GetMyEntityAsync
yöntemi, bu anahtarla önbellekten öğeyi almayı dener. Eşleşen bir öğe bulunursa o öğe döndürülür. Önbellekte bir eşleşme yoksa GetMyEntityAsync
yöntemi nesneyi veri deposundan alır, önbelleğe ekler ve ardından onu döndürür. Veri deposundaki verileri gerçekte okuyan kod, veri deposuna bağımlı olduğundan dolayı burada gösterilmemiştir. Önbelleğe alınan öğe başka bir yerde güncelleştirildiyse eskimesini engellemek için süresi dolacak şekilde yapılandırıldığını unutmayın.
// 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;
}
Örneklerde depoya erişmek ve önbellekten bilgi almak için Redis için Azure Cache kullanılır. Daha fazla bilgi için bkz. Redis için Azure Cache kullanma ve Redis için Azure Cache ile Web Uygulaması oluşturma.
Aşağıda gösterilen UpdateEntityAsync
yöntemi, değer uygulama tarafından değiştirildiğinde önbellekteki nesnenin nasıl geçersiz kılınacağını 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 veri deposu güncelleştirilmeden önce bir istemci o öğeyi almak istediğinde küçük bir zaman penceresi olur. Bu durum önbellek isabetsizliği ile sonuçlanır (öğe önbellekten kaldırıldığı için) ve veri deposundan öğenin önceki sürümünün alınıp önbelleğe geri eklenmesine neden olur. Sonuçta önbellekte eski veriler olur.
İlgili kaynaklar
Bu desen uygulanırken aşağıdaki bilgiler ilgili olabilir:
Güvenilir web uygulaması deseni , bulutta yakınsanan web uygulamalarına önbelleğe alma düzeninin nasıl uygulanacağını gösterir.
Önbelleğe Alma Kılavuzu. Verileri bir bulut çözümünde önbelleğe nasıl alabileceğiniz ve önbelleği uygularken dikkate almanız gereken sorunlar hakkında ek bilgiler verir.
Veri Tutarlılığı Temel Bilgileri. Bulut uygulamaları genellikle veri depolarına dağılmış verileri kullanır. Bu ortamda veri tutarlılığını yönetmek ve korumak sistemin önemli bir özelliğidir, özellikle eşzamanlılık ve kullanılabilirlik sorunları ortaya çıkabilir. Bu temel bilgiler, dağıtılmış veriler arasındaki tutarlılıkla ilgili sorunları açıklar ve bir uygulamanın verilerin kullanılabilirliğini sürdürmek için nihai tutarlılığı nasıl uygulayabileceğini özetler.