C# ile Windows Server AppFabric Önbellek Etkileşimi

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 verilmelidir;

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.

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' ahtarı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

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

4 yorum

  1. Mehmet Emin   •  

    Merhabalar,
    Yazı çok güzel olmuş teşekkürler. Fakat uğraşıpta yapamadığım bir konu var. Elimizde 2 tane pc olsun diyelim. Biri server biri ise client. Yani biri application server (database,servisler,caching barındırıyor) diğeri ise web server (application serverdaki servisleri kullanan makina). Şimdi ben application server tarafında AppFabric server ı kurdum,yapılandırdım,cache cluster oluşturdum ve bir kaç nesne ekledim. Web server makinamdan app fabric makinama ulaşmam için sisteme AppFabric server kurmalıyımım? Kurarak denedim, bu seferde ip adresinden application serverdaki cache e bağlantı sağlayamıyor. Nette açıklayıcı bir bilgi bulamadım yardım ederseniz sevirim. Teşekkürler.

  2. Fatih Boy   •  

    [b]@ Mehmet Emin[/b]:
    Öncelikle web sunucun üzerinden bir başka makinedeki önbellek hizmetini kullanabilmek için web sunucun üzerine de AppFabric kurmak zorunda olmadığını belirtmeliyim. Bir önbellek hizmetine istemci olarak bağlanılacak sunucularda sadece istemci kütüphanelerinin bulunması yeterli olacaktır. Kaldı ki bu kütüphaneler istemci bilgisayarda bulanmazsa uygulaman assembly bulunamadı şeklinde bir hata verecektir, atlaman mümkün değil 😉

    Uygulama sunucun üzerine kurduğun AppFabric önbellek hizmetine web sunucun üzerinden erişebilmen için öncelikle iki sunucunun ağ üzerinde birbirini görebiliyor olması lazım, ki bunu zaten kontrol ettiğini kabul ediyorum. İkinci önemli nokta sunucu üzerinde bir firewall varsa önbellek hizmetince kullanılan portlar için istisna tanımlanmış olmalıdır. Son olarak ise, genelde atlanan bir noktadır, istemci bilgisayarında uygulamanı çalıştırdığın kullanıcı için önbellek kümesine erişim yetkisi tanımlanmış olmalıdır.

    Kullanıcıya Windows Server Appfabric PowerShell oturumundan (başlat menüsü -> Windows Server AppFabic -> Önbelleğe Alma Yönetimi Windows PowerShell) aşağıdaki komut yardımıyla erişim yetkisi tanımlayabilirsin:

    Grant-CacheAllowedClientAccount <kullanıcı adı>

    Windows Server AppFabric önbellek hizmetinin çalıştığı makine üzerindeki bir asp.net uygulamasına erişim yetkisi verilmesi konusundaki makalemden de bilgi alabilirsin : http://www.enterprisecoding.com/post/Tip-IIS-7-ve-AspNet-icin-AppFabric-Cache-Erisim-Yetkisi.aspx

    İyi günler,
    Fatih Boy

  3. Mehmet Emin   •  

    cevabınız için çok teşekkür ederim, evet dediğiniz gibi iki makina bir birini ağda görüyor fakat ikiside windows hesabı ile korunduğundan dosyalara kullanıcı adı ve şifre girilmeden göz atılamıyor. Ben Powershell den yetki verirken bunu Cache in olduğu makinadan vereceğim büyük ihtimal, fakat ben hangi kullanıcıya bu hakkı vermem gerekiyor. Benim uygulamam bir console uygulaması mesela. Veya bir wcf servis. Ben Everyone a yetki versem olay çözülür mü?

  4. Fatih Boy   •  

    [b]@ Mehmet Emin[/b]:

    Hangi kullanıcıya yetki vereceğiniz iki senaryoya göre değişiklik gösterecektir.

    Bir konsolu uygulamasını ele alacak olursak, konsol uygulaması önbelleğe o anki kullanıcı yetkileri ile bağlanmayı deneyecektir. Dolayısıyla da uygulamayı çalıştıran kullanıcının erişim yetkisinin tanımlı olması gerekir.

    Eğer wcf servisiniz bir konsol uygulaması ya da windows hizmeti üzerinden çalışıyor ise yukarıdaki senaryo ile aynı durum geçerli, çalıştıran kullanıcı için yetki tanımlanmalı.

    Eğer wcf servisiniz IIS üzerinde çalışıyor ise bu durumda servisin bulunduğu uygulamanın hangi worker process ile çalıştığını bulun, ardında da bu worker process’in hangi kullanıcı yetkisiyle çalıştığına bakın. Bu kullanıcıya yetki vermeniz yeterli olmalı.

    Not; yetkiyi önbelleği yönetme yetkisi olan bir kullanıcı ile Windows Server AppFabric Önbellek yönetim bileşenleri kurulu olan herhangi bir makine üzerinden verebilirsiniz. Tabiki en kolayı önbellek kümesine dahil olan bir sunucu üzerinden bu işlemleri yapmak olacaktır.

    İyi günler,
    Fatih Boy

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir