Makale Özeti

Windows Server AppFabric ve önbellek hakkında şimdiye kadar sizlerle paylaştığım bilgilerden sonra bu makalemde bizlere sunulan önbellek kütühanesini C# üzerinden nasıl kullanıllabileceğini paylaşacağım.

Makale

Daha önceki makalelerimde sizlerle Windows Server AppFabric’in nasıl kurulacağını, geliştirme ortamının nasıl hazırlanacağını paylaşmıştım. Bu makalemde ise C# ile Windows Server AppFabric önbelleğiyle nasıl etkileşimde bulunacağınızı paylaşacağım.

Önbelleği kullanmaya başlamadan önce Sistem yöneticisi ile görüşerek Windows Server AppFabric Önbellek hizmetinin kurulu olduğu sunucuları ve bu sunuculardaki önbellek portunu öğrenmelisiniz. Makalemin geri kalanında Windows Server AppFabric önbellek kümesinin yerel makinenizde 22233 portu üzerinden hizmet veren tek bir sunucu ile hizmet verdiği varsayımıyla örnekleme yapacağım.

C# ile bir önbellek kümesine bağlanmak için öncelikle bir yapılandırma sınıfı (DataCacheFactoryConfiguration) oluşturmalı ve bu sınıf içerisinde en az bir önbellek kümesi üyesi önbellek sunucusu belirtmelisiniz.

var yapilandirma = new DataCacheFactoryConfiguration();
yapilandirma.Servers = new[] { new DataCacheServerEndpoint("localhost", 22233) };
yapilandirma.LocalCacheProperties = new DataCacheLocalCacheProperties();

Yukarıda da belirttiğim gibi burada en az bir önbellek sunucu bilgisi verilmesi yeterlidir. Windows Server AppFabric önbellek kütüphanesi arka planda bu bilgiyi kullanarak önbellek kümesine bağlanmakta ve kümedeki tüm önbellek sunucularının bilgilerini almaktadır. Yüksek erişilebilirlik gerektiren bir uygulama geliştiriyorsanız size tavsiyemse burada kümenizde bulunan mümkün olduğunca fazla sunucunun bilgisini vermeniz; çünkü tek sunucu bilgisinin verildiği senaryolarda ilk bağlantı sırasında bu sunucunun erişilemiyor olması halinde kümedeki diğer sunucular ayakta olsa bile uygulamanız onlardan haberdar olmadığı için kullanılamayacaktır.

Yukarıdaki kod satırları sonrasında geriye kümeye bağlanmak için yapmanız gereken tek satır kod kalıyor; önbellek fabrikasının oluşturulması.

var onbellekFabrikasi = new DataCacheFactory(yapilandirma);

Bu kod ile birlikte uygulamanı kümeye bağlanacak ve bu önbellek fabrikası üzerinden isteğiniz belleğe erişebileceksiniz. Kime geliştirme/üretim ortamlarında yukarıdaki kodlar işletilirken aşağıdaki hata ile karşılaşabilirsiniz;

ErrorCode<ERRCA0017>:SubStatus<ES0006>:Geçici bir hata var. Lütfen daha sonra yeniden deneyin. (Belirtilen Önbellek sunucularından biri veya birden fazlası, ağın ya da sunucuların meşgul olması nedeniyle kullanılamıyor. Kümede bu istemci hesabına güvenlik izni verildiğinden ve tüm önbellek konaklarında güvenlik duvarı aracılığıyla AppFabric Önbelleğe Alma Hizmeti'ne izin verildiğinden emin olun. Daha sonra yeniden deneyin.)

Genelde yazılımcının unutkanlığından kaynaklanan bu hatayı aldığınızda öncelikle önbellek hizmetinin çalıştığından emin olun. Hizmetin çalışmıyor olması durumunda sistem yöneticisi olarak başlatılan PowerShell oturumunda (Başlat menüsü –> Windows Server AppFabric –> Önbelleğe Alma Yönetimi Windows PowerShell) aşağıdaki komut ile önbellek kümesini başlatmalısınız;

start-cachecluster

Önbellek kümesi çalışıyor olmasına rağment bu hatayı alıyorsanız önbellek kümesine erişim yetkiniz olmayabilir. Bu durumda uygulamayı çalıştıran kullanıcının/makinenin önbelleğe erişim yetkisi olup olmadığı aşağıdaki Windows Server AppFabric PowerShell komutu ile kontrol edilmeli;

Get-CacheAllowedClientAccounts

Eğer bu komutun çalıştırılması sonucu gelen liste içerisinde kullanıcı/makine yer almıyorsa aşağıdaki komut vasıtasıyla önbellek kümesine erişim yetkisi

Grant-CacheAllowedClientAccount [KULLANICI ADI]

Önbellek kümesi erişim yetkisi ile ilgili sıkıntıları çözdükten sonra aşağıdaki komut ile varsayılan önbellek alınarak üzerinde işlem yapılabilir.

var onbellek = onbellekFabrikasi.GetDefaultCache();

Tabi ki işlemlerinizi varsayılan önbellek dışında bir başka önbellek üzerinde de gerçekleştirebilirsiniz. Bu durumda kodumuz aşağıdaki gibi olmalıdır;

var onbellek = onbellekFabrikasi.GetCache("[ÖNBELLEK ADI]");

Yukarıdaki her iki kod parçacığına da performans açısında bakacak olursak; önbelleği bir önbellek fabrikasından almak maliyetli bir iştir. Bu sebeple de her ihtiyaç duyulduğunda önbellek fabrikasından bir örneğini almak yerine bir defa alarak bunu bir değişken içerisinde saklamak ve gerektiğinde bu değişken üzerinden işlem yapmak daha doğru olacaktır.

Önbellek’e erişmek için onbellek nesnemizi oluşturduktan sonra isterseniz şimdi de nasıl içerisine veri koyabileceğimizi görelim. Windows Server AppFabric önbelleğe konulacak olan nesneler için tek zorunluluk bu nesnelerin serilize edilebilir olarak işaretlenmiş olmasıdır. Bunun için sınıf tanımlamasının hemen üzerinde Serializable özniteliği kullanılmalıdır. Aşağıda tanımlamasını bulacağınız OnbellegeAtilabilirNesne sınıfı önbelleğe alınabilecek sınıfların tanımlarına bir örnek olup yazımın devamında bu sınıf üzerinden örnekleme yaparak konunun pekişmesine çalışacağım.

[Serializable]
public class OnbellegeAtilabilirNesne {
    public string BirStringIfade { get; set; }
    public int BirIntIfade { get; set; }
}

Görüldüğü gibi basit bir tanımlamaya sahip olan OnbellegeAtilabilirNesne sınıfı bir string ve bir int özellikten oluşmaktadır.

Windows Server AppFabric önbelleğe yeni bir nesne koymak için öncelikle ilgili sınıfın bir örneğini almalı ve bu örnek için tekil bir anahtar belirlemelisiniz. Ardından önbellek nesnesi üzerindeki Add metodu yardımıyla nesnenizi önbelleğe ekleyebilirsiniz;

var ornekVeri = new OnbellegeAtilabilirNesne {
    BirStringIfade = "Test verisi",
    BirIntIfade = 1
};

var ornekVeriSurumu = onbellek.Add("testAnahtari", ornekVeri);

Add metodu ile ilgili dikkat etmeniz gereken bir nokta, bu metodu kullanarak bir önbelleğe aynı anahtarla ikinci bir değer eklenemeyecek olmasıdır. Eğer yukarıdaki kodu arka arkaya iki kez çalıştıracak olursanız aşağıdaki hatayı aldığınızı göreceksiniz;

ErrorCode<ERRCA0008>:SubStatus<ES0001>:Önbellekte zaten varolan bir Anahtar ile nesne oluşturulmaya çalışılıyor. Önbellek, nesneler için yalnızca benzersiz Anahtar değerlerini kabul eder.

Ancak; eklediğiniz ilk değer zamanının dolmasıyla birlikte hafızadan silinirse ikinci kez eklediğinizde bu hata mesajını almazsanız.

Önbelleğe değer ekleme sırasında kullanılan Add metoduna alternatif olarak Put metodu da kullanılabilir. Üstelik Add metodundan farklı olarak Put metodunda aynı anahtar ile ikinci bir değer eklenmesi durumunda hata almazsınız. Put metodu aynı değerle ikinci bir anahtar eklenmeye çalışıldığında önceki değerin üzerine yeni değeri yazar.

var ornekVeri = new OnbellegeAtilabilirNesne {
    BirStringIfade = "Test verisi",
    BirIntIfade = 1
};

var ornekVeriSurumu = onbellek.Put("testAnahtari", ornekVeri);

Bu iki metodtan hangisi kullanacağınız iş mantığınıza göre değişecektir.

Önbelleğe eklenmiş verilere Get metodu kullanılarak erişilebilir. Aşağıdaki kod parçacığı daha önceden önbelleğe testAnahtari anahtarı ile eklediğimiz veriye nasıl erişebileceğimizi göstermektedir;

OnbellegeAtilabilirNesne ornekVeri;

if ((ornekVeri = (OnbellegeAtilabilirNesne)onbellek.Get("testAnahtari")) != null) {
    MessageBox.Show(string.Format(@"'testAnahtari' ana,htarıyla saklanmış veri önbellekten okundu :
    BirStringIfade : {0}
    BirIntIfade : {1}",
    ornekVeri.BirStringIfade,
    ornekVeri.BirIntIfade));
}
else {
    MessageBox.Show("Önbellekte 'testAnahtari' anahtarı ile bir veri bulunamadı");
}

Add, Put ve Get metodları aksi belirtilmediği sürece küme tarafında yonetilen sitem regionlarında işlem yapmaktadır. İstenirse bu metodların işlem yapılmak istenen region’ı belirtebileceğiniz overload’ları da kullanılabilir. Aşağıdaki kod parçacığı ile Add ya da Put ile eklediğiniz verilerin hangi sistem alanında yer aldığını bulabilirsiniz;

var testAnahtariBolgeAdi = onbellek.GetSystemRegionName("testAnahtari");

Önbelleğe eklediğiniz bir veriyi silmek isterseniz de onbellek nesnesi içerisinde yer alan Remove metodunu kullanabilirsiniz;

onbellek.Remove("testAnahtari");

Görüldüğü gibi Windows Server AppFabric Önbellek işlemleri daha önceki makalelerimde sizlerle paylaştığım mimariyi mümkün olduğunda saklayarak geliştiricilere mümkün olan en basit şekilde bir arayüz sağlamıştır. Pek çok işlem bir kaç basit metod çağrısı ile yapılabilir. Buna bir başka örneği aşağıdaki region oluşturarak bu region içerisine veri eklemeyi göstern kod parçacığında bulabilirsiniz;

onbellek.CreateRegion("testBolgesi");
onbellek.Add("testAnahtari1", new OnbellegeAtilabilirNesne {
    BirStringIfade = "Test verisi 1",
    BirIntIfade = 1
    }, "testBolgesi");

onbellek.Add("testAnahtari2", new OnbellegeAtilabilirNesne {
    BirStringIfade = "Test verisi 2",
    BirIntIfade = 1
    }, "testBolgesi");

onbellek.Add("testAnahtari3", new OnbellegeAtilabilirNesne {
    BirStringIfade = "Test verisi 3",
    BirIntIfade = 1
    }, "testBolgesi");

Şimdiye kadar anlattıklarım Windows Server AppFabric önbelleğini kullanan uygulamalar geliştirmenizde hızlı bir başlangıç olacaktır. Temel işlemler olan veri ekleme, değiştirme ve çıkarmanın yanı sıra bir bölge oluşturup aynı işlemleri bu bölge üzerinde gerçekleştirebilirsiniz.

Windows Server AppFabric önbelleği yukarıda anlattığım istemci kütüphanesi sayesinde önbellek kümesi ile haberleşebilmektedir. Bu haberleşme de arka planda WCF altyapısını kullanmaktadır. Yapılan bu işlemler ağ üzerinde gidip geldiği için bir maliyeti vardır. Bir önbelleği ilk kez ayağa kaldırırken programsal olarak yaptıklarımızı ele alalım; önbellekten veri çekerken kullandığımız her Get metod çağrısında bir WCF isteği oluşmakta, bu durumda büyük ölçekli verileri getirirken oluşacak yükü sanırım anlatmama gerek yok. Windows Server AppFabric önbelleği tasarlanırken bu gibi senaryolar da göz önüne alınarak toplu veri çekilmesi için bir metod eklemiştir; BulkGet. Belirli bir bölge için vereceğiniz anahtarlar çekilerek uygun veriler size toplu olarak iletilmektedir. Aşağıda bir önceki örnekte oluşturduğum ve içerisine veri eklediğim testBölgesi içerisindeki verilerin BulkGet ile sorgulanmasına dair örnek bir kod parçacığı bulabilirsiniz;

var ornekVeriler = onbellek.BulkGet(new[] {
    "testAnahtari1",
    "testAnahtari2",
    "testAnahtari2" }, "testBolgesi");

Dağıtık bir ortamda önbellek hizmeti sunan Windows Server AppFabric’in sunduğu bir diğer özellikte güvenli güncellemedir. Güncellenmesi istenen nesne, istenirse küme içerisinden alınırken kilitlenmekte, bu sayede de aynı anda tek bir istemci nesneye erişerek güncelleyebilmektedir. Güvenlik güncelleme amacıyla Windows Server AppFabric önbellek bize  Unlock, GetAndLock, PutAndUnlock gibi metodlar sunmaktadır.

Aşağıdaki örnek kod parçacığında, daha önceden testAnahtari anahtari ile önbelleğe eklemiş olduğumuz nesne GetAndLock metodu kullanılarak kilitlenerek değeri alınmış ve PutAndUnlock metodu ile güvenli bir şekilde güncellenerek kilit kaldırılmıştır.

DataCacheLockHandle handle;
var onbellegeAtilabilirNesne = onbellek.GetAndLock("testAnahtari",
    TimeSpan.FromSeconds(1),
    out handle) as OnbellegeAtilabilirNesne;

onbellegeAtilabilirNesne.BirStringIfade = "Değiştirilmiş Veri";

onbellek.PutAndUnlock("testAnahtari", onbellegeAtilabilirNesne, handle);

Dikkat edecek olursanız bu örnekte nesne GetAndUnlock ile değeri alınıp önbellekte kilitlenirken parametre olarak TimeSpan kabul etmekte. TimeSpan kullanarak belirttiğimiz bu süre nesnenin önbellek tarafından ne kadar süreyle kilitli tutulacağını belirtir. Bu süre içerisinde nesne kilidi kaldırılmazsa önbellek otomatik olarak kaldıracaktır. Bu yöntem sayesinden olası istemci bağlantı problemleri sonucunda nesnenin sonsuza kadar kilitli kalmasının önüne geçilmiş olur.

Kilitlenmiş bir nesne üzerinde yapılan işlemler sonrasında herhangi bir güncelleme yapılmadan kilidin kaldırılması istenirse PutAndUnlock yerine Unlock metodu kullanılabilir. Unlock metodu veri güncellemesi yapmayıp sadece mevcut kilidi kaldıracaktır.

Not : GetAndLock ile bir anahtara ait değeri almaya ve kilitleme çalıştığınızda kaydı olmayan bir anahtar kullanırsanız aşağıdaki hata mesajını alırsınız;

ErrorCode<ERRCA0006>:SubStatus<ES0001>:Başvurulan Anahtar yok. Hatayı gidermek için bir Anahtarı temel alan nesneler oluşturun.

Fatih Boy

http://www.enterprisecoding.com
http://twitter.com/fatihboy