https://www.buraksenyurt.com/Burak Selim Şenyurt - Velocity Project2010-04-09T15:35:13+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://www.buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://www.buraksenyurt.com/post/Microsoft-Distributed-Cache(Velocity-Project)-Hello-WorldMicrosoft Distributed Cache(Velocity Project) - Hello World2009-12-11T00:25:00+00:00bsenyurt<p><img style="float: right;" src="/pics/2009%2f11%2fblg95_Giris2.jpg" alt="" />Merhaba Arkadaşlar,</p>
<p>Bazen bir otomobilin çok hızlı gitmesi, yüksek süratlere çıktığında direksiyonunun titrememesi, yolda sağa sola savrulmaması, keskin virajlarda rahatlıkla tutunabilmesi, vitesler arasındaki geçişlerde torkunun mümkün olduğunca korunabilmesi, frenajlarda kontrolü sağlaması vb... istenir. Yarış otomobillerinde bu ve benzeri ihtiyaçlar için çok sık duyduğumuz tunning olarak isimlendirilen geliştirmeler yapılır. Bazen yarışın kategorisine göre neredeyse teknolojinin sınırlarını zorlayacak yeniliklere şahit olunur. Ama özetle aracın performansını arttıracak her yol, kuralları çerçevesinde mübahtır.</p>
<p>Performansı arttırmak önemli bir kriterdir ve her zaman kolay bir şekilde sağlanamamaktadır. Bazen motor yağına konulan katkı maddeleri ile basit şekilde, bazen yarış pistindeki ıslak zemine göre takılan lastikler zor şekilde vb... Yine enteresan bir giriş olduğunun farkındayım ama bu günkü konumuz yazılımda performansı arttırmak adına kullanılan önemli tekniklerden birisi ile ilgilidir. <strong>Caching</strong>. <strong>Web</strong> uygulamalarında sıklıkla karşılaştığımız, <strong>Enterprise Library Caching Block </strong>sayesinde Web uygulaması sınırlarını aşarak diğer uygulamalarda daha kolay kullanılabilir hale gelmiş bu kavramın servis bazlı hale getirilebildiğini duysanız acaba ne düşünürdünüz <img title="Surprised" src="/editors/tiny_mce3/plugins/emotions/img/smiley-surprised.gif" alt="Surprised" border="0" /> İşte <strong>Microsoft' </strong>un uzun bir süre önce duyurduğu ve şu anda <strong>CTP 3 </strong>sürümü bulunan kod adı <strong>Velocity </strong>projesi...</p>
<p><strong>Microsoft'</strong> un Velocity kod adlı projesi aslında <strong>Distributed Caching Service </strong>olarakta bilinmektedir. Projenin en büyük amacı, her çeşit veri içeriğinin ön belleklenerek saklanabilmesini sağlamaktır. Bu açıdan düşünüldüğünde <strong>Enterprise Library </strong>içerisindeki <strong>Caching </strong>bloğu veya <strong>Asp.Net </strong>içerisinde kullanılan <strong>Cache </strong>tekniklerinden bir farkı yokmuş gibi görünebilir. Hatta tüm bu modellerin ortak amacının, uygulamaların fiziksel veri bölgelerine tekrar tekrar gitmelerini engelleyip performansı arttırmak olduğu da aşikardır. Aslında aradaki tek fark Velocity projesinde bir servis anlayışının olması değildir. Farkı görmek için projenin detaylarına belikde daha yakından ve derinden bakmak gerekmektedir. Öncelikli olarak projenin ne gibi yetenekleri sunduğuna maddeler halined bir bakalım;</p>
<ul>
<li>Veritabanı veya Hard Disc üzerindeki herhangibir veri içeriğinin Cache' lenebilmesi</li>
<li>Yüksek Ölçeklenebilirlik(High Scalability)</li>
<li>Cache yönetiminin Windows Service tarafından sağlanması(Varsayılan olarak Network Service hesabı ile yüklenen bir Windows Service' inden bahsediyoruz)</li>
<li>Clustering ile Cache üzerinde yük dağılımının dengelenmesinin(Load Balancing) otomatik yönetimi </li>
<li>Cache içerisindeki veriye anahtar alanlar, farklı tanımlayıcılar yada name tag' leri ile erişilebilmesi</li>
<li>Optimistic ve Pesimistic Concurrency modellerini desteklemesi</li>
<li>Asp.Net Session nesnelerinin Distributed Cache üzerinden veritabanına yazılmadan tutulabilmesinin sağlanması</li>
<li>TCP/IP bazlı servis alt yapısının kullanılmas(Dikkat; Firewall istisnaları oluşabilir)</li>
</ul>
<p>vb...</p>
<p>Şimdi bu konu ile ilişkili bir örnek geliştirmeye çalışacağız. Ama öncesinde Cache yönetimini üstlenecek makineye <strong>Velocity</strong> projesini kurmamız gerekiyor. Ne varki bu kurulum her ne kadar Next-Next şeklinde görünse de dikkat edilmesi gereken bazı noktalar var. Kurulum ile ilişkili en önemli noktalardan birisi <strong>depolama yeri(Storage Location) </strong>ve <strong>tipi(Storage Type)</strong>. Ben kendi kurulumumda <strong>ağ paylaşımı(Network Shared)</strong> yapılmış ve gerekli <strong>izinler(Permissions)</strong> tamamlanmış olan <strong>VelocityZone</strong> isimli bir klasörü kullanmayı planlıyorum. Bu belirleme işlemi sırasında sizlere sorun çıkartabilecek noktalar <strong>\\makineAdı\KlasorAdı</strong> isimli bir lokasyonun olmayışı<em>(ki bunu kendimiz belirliyoruz)</em> ve bu alanla ilişkili yeterli <strong>izinlerin(Permission)</strong> bulunmayışı olacaktır. Bu sorunlar aslında <strong>Test Connection</strong> düğmesine tıklandığında çıkan hata mesajları yardımıyla görülebilir. Eğer herhangibir sorun yoksa <strong>Cluster</strong> oluşturulması adımına geçilmektedir. Örnekte ben <strong>ClusterZoneA </strong>isimli ve <strong>Small </strong>tipinden bir <strong>Cluster </strong>oluşturdum.</p>
<p><img src="/pics/2009%2f11%2fblg95_Setup.gif" alt="" /></p>
<p><strong>Small</strong> seçimi aslında arka planda <strong>1 </strong>ile <strong>4 </strong>arası <strong>Cache Server' </strong>ın kullanılabileceğini ifade etmektedir. Tahmin edileceği üzere örneği yerel makine üzerinden çalıştırdığımızdan burada tek bir <strong>Cache Server</strong> mevcuttur. Tam bu noktada aslında mimari modelden biraz bahsetmekte yarar olacağı kanısındayım. Aslında istemci için mantıksal olarak tek bir <strong>Cache</strong> birimi ile çalışmaktadır. Fakat birden fazla <strong>Cache Server</strong> olabilir ve bunlar arka planda farklı makinelerdeki <strong>Cache Service'</strong> leri<em>(ki Windows Service' leridir) </em>refere edebilir. Buda zaten <strong>Load Balancing </strong>kurulumu açısından önemlidir. Aynen aşağıdaki şekilde olduğu gibi.</p>
<p><img src="/pics/2009%2f11%2fblg95_Architecture.gif" alt="" /></p>
<p>Birde mantıksal modele bakalım mı? <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> Haydi bakalım.</p>
<p><img src="/pics/2009%2f11%2fblg95_Logical.gif" alt="" /></p>
<p>İlk kurulumnda varsayılan Cache mantığı kullanılır. Ancak istenirse farklı isimlendirmelere sahip birden fazla Cache alanı kullanılabilir. Özellikle uygulamalar kaç adet olursa olsun her biri için ayrı ayrı Cache isimlendirilmeleri kullanılabileceğini düşünebiliriz. Buna göre her farklı Cache birbirlerinden tamamen bağımsız olarak değerlendirilebilir. Örneğin <strong>Policy' </strong>leri ayrı ayrı belirlenebilir. Diğer yandan <strong>Regions </strong>bazlı mantıkta çalışma zamanında ayarlamalar yapılması gerekmektedir.</p>
<p>Bir başka deyişle <strong>Region' </strong>ların oluşturulması çalışma zamanında gerçekleştirilir. <strong>Region </strong>mantığına göre <strong>Cache </strong>içeriklerine <strong>Key' </strong>den farklı olarak <strong>Tag' </strong>ler yardımıyla<em>(ki birden fazla Tag değerinin bir Cache nesnesi ile ilişkilendirebiliriz) </em>ulaşılabilir. Burada <strong>Region </strong>bazlı bir ayrıştırma yapıldığından arama gibi işlemlerde <strong>Tag' </strong>lerden yararlanılabilir. <strong>Region </strong>mantığında <strong>Cache </strong>içerikleri tek bir host içerisinde tutulur. Yani diğer modellerdeki gibi servisler tarafından dağıtık olarak kullanılmazlar. Bu önemli bir farktır. Nitekim arama fonksiyonelliğinin avantajı ortaya çıkarken, Named mantığında olduğu gibi dağıtık kullanım söz konusu olmadığından <strong>ölçeklenebilirlik(Scalability)</strong> ortadan kalkmaktadır.</p>
<p>Kurulum işleminin sonrasında klasör içeriğinin aşağıdaki gibi şekillendiğini görebiliriz.</p>
<p><img src="/pics/2009%2f11%2fblg95_FolderContent.gif" alt="" /></p>
<p>Kurulum işlemi bu şekilde tamamlandıktan sonra programlardan<strong>(Microsoft Distributed Cache | Administration Tool - Microsoft Distributed Cache) </strong>ilgili <strong>Administration Tool </strong>aracınının kullanılarak <strong>Cluster' </strong>ın başlatılması gerekmektedir. Bu amaçla <strong>Administration Tool </strong>komut satırından <strong>Start-CacheCluster </strong>yazmamız yeterli olacaktır. Böylece ilgili <strong>Distributed Cache Service </strong>örneğinin vermiş olduğumuz kriterlere göre ilgili <strong>Port </strong>üzerinden çalıştırılması sağlanmış olur.</p>
<p><img src="/pics/2009%2f11%2fblg95_StartCache.gif" alt="" /></p>
<p>Yukarıdaki ekran görüntüsünde <strong>Get-CacheHelp</strong> kullanımı sonucu yönetsel işlemler için hangi komutların kullanılması gerektiğide görülmektedir. Örneğin başlattığımız <strong>Cache Cluster </strong>hizmetini durdurmak için <strong>Stop-CacheCluster </strong>komutunu kullanmamız yeterlidir.</p>
<p><img src="/pics/2009%2f11%2fblg95_StopCache.gif" alt="" /></p>
<p>Servis başarılı bir şekilde çalıştırıldığında bunu <strong>Services</strong> aracından da görebiliriz.</p>
<p><img src="/pics/2009%2f11%2fblg95_Services.gif" alt="" /></p>
<p>Artık kurulumu yaptığımıza ve servisi çalıştırdığımızda göre örnek bir uygulama geliştirerek <strong>Velocity</strong> üzerinden <strong>Cache' </strong>lemenin nasıl yapılabileceğine bakabiliriz. Tabiki söz konusu uygulamanın <strong>Velocity </strong>servisini kullanabilmesi için gerekli bazı <strong>Assembly' </strong>ları referans etmesi gerektiği de ortadadır. Bu referanslar aslında kurulum sonrası <strong>Program Files\Microsoft Distributed Cache\V1.0 </strong>klasörüne atılacaktır.</p>
<p><img src="/pics/2009%2f11%2fblg95_References.gif" alt="" /></p>
<p>Şimdi <strong>Visual Studio 2010</strong> <strong>Ultimate Beta 2</strong> ortamında örnek bir <strong>Windows Forms </strong>uygulaması açalım ve ilgili <strong>Assembly' </strong>ları projemize referans edelim.</p>
<p><img src="/pics/2009%2f11%2fblg95_ProjectReferences.gif" alt="" /></p>
<p>Uygulamamızda Velocity projesini kullanabilmemiz için çalışma zamanına bazı konfigurasyon bilgilerinin bildiriminin yapılması gerekmektedir. Bu nedenle <strong>App.config </strong>dosyasının içeriğini aşağıdaki gibi değiştirerek devam edebiliriz.</p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false"><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="dataCacheClient"
type="Microsoft.Data.Caching.DataCacheClientSection, CacheBaseLibrary"
allowLocation="true"
allowDefinition="Everywhere"/>
</configSections>
<dataCacheClient deployment="simple">
<localCache isEnabled="true" sync="TTLBased" ttlValue="300" />
<hosts>
<host name="bsenyurt" cachePort="22233" cacheHostName="DistributedCacheService"/>
</hosts>
</dataCacheClient>
</configuration></pre>
<p>Tahmin edileceği üzere uygulamanın <strong>Distributed Cache</strong> sistemini nasıl kullanacağına dair tüm konfigurasyon bilgileri buradaki ilgili elementler içerisinde bildirilmektedir. Söz gelimi host kısmında az önce başlatılan servise ait bilgiler yer almaktadır. <strong>Port</strong> bilgisi, host makinenin adı gibi. Yine <strong>localCache </strong>elementi içerisinde <strong>Cache </strong>üzerinde verinin tutulma süresinin belirlenmesi için <strong>ttlValue </strong>niteliğine saniye cinsinden bir değer atanmaktadır. Aynı element içerisinde yer alan <strong>sync </strong>niteliğine atanan <strong>TTLBased </strong>değeri ile zaman aşımlı bir <strong>Cache' </strong>leme kullanılacağı bildirilmektedir.</p>
<blockquote>
<p>Kişisel Not : Buradaki ayarları manuel olarak yapmamız bir dezavantaj olarak düşünülebilir. Malum Enterprise Libary içerisinde dahi bu tip ayarlar görsel olarak kolayca yapılabilmektedir. Üstelik App.config dosyası içerisinde intelli-sense özelliğide olmadığından şimdilik Copy-Paste kuralları ile ilerlemek zorunda kalmış durumdayız. Bu durumun Relase sürümde özellikle Visual Studio 2010 ile olan entegrasyonunda düzeleceğini düşünmek istiyorum.</p>
</blockquote>
<p>Neyse biz kaldığımız yerden devam edelim. Windows Form' umuzu aşağıdaki gibi tasarladığımızı düşünelim.</p>
<p><img src="/pics/2009%2f11%2fblg95_Form.gif" alt="" /></p>
<p>Aslında <strong>Hello World</strong> uygulamamızın amacı çok basit. <strong>Cache</strong>' e veri ekleyebilmek, var olanı çekebilmek ve güncelleyebilmek. <strong>String </strong>tipinden bir veri içeriğini saklıyor olacağız. Ancak tabiki kullanıcı tanımlı tiplerin de saklanabileceğini bir kere daha hatırlatalım. Uygulama kodlarmızı aşağıdaki gibi geliştirebiliriz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Windows.Forms;
using Microsoft.Data.Caching;
namespace HelloVelocity
{
public partial class Form1 : Form
{
// DataCache nesnesi tanımlanır
DataCache dCache = null;
public Form1()
{
InitializeComponent();
DataCacheFactory factory = new DataCacheFactory();
//Fabrika nesne örneğinin GetDefaultCache metodundan yararlanılarak varsayılan DataCache nesne referansı elde edilir.
dCache = factory.GetDefaultCache();
}
// Cache' den veri çekme işlemi
private void btnGetFromCache_Click(object sender, EventArgs e)
{
// Get metodu parametre olarak Cache' de duran nesnenin Key özelliğini alır. Örneğimizde Key özelliğinin değeri City' dir
string cacheContent = dCache.Get("City") as string;
if (!String.IsNullOrEmpty(cacheContent))
{
// Eğer cacheContext içeriği bol veya null değilse TextBox kontrolüne aktarılır
txtCities.Text = cacheContent;
}
}
// Cache' e veri ekleme işlemi için kullanılır
private void btnSaveToCache_Click(object sender, EventArgs e)
{
try
{
// Add metodunun ilk parametresi Cache' de tutulacak veriyi işaret eden Key değeridir. İkinci parametre ile Cache' de duracak veri içeriği belirtilir.
dCache.Add("City", txtCities.Text);
}
catch (Exception excp)
{
MessageBox.Show(excp.Message);
}
}
// Cache' de zaten var olan bir veri içeriğinin güncellemek için kullanılır.
private void btnUpdate_Click(object sender, EventArgs e)
{
try
{
// İlk parametre Cache' de duran nesnenin Key değeridir. İkinci parametre ise yeni halidir.
dCache.Put("City", txtCities.Text);
}
catch (Exception excp)
{
MessageBox.Show(excp.Message);
}
}
}
}</pre>
<p>Aslında <strong>DataCache</strong> nesnesi <strong>Cache</strong> ile ilişkili tüm yönetsel işlemleri üstlenmektedir. <strong>Add, Put </strong>ve <strong>Get </strong>metodları sırasıyla <strong>Cache' </strong>e veri ekleme, Cache' deki veriyi güncelleme ve Cache' den veri çekme işlemleri için kullanılmaktadır. Tüm bu metodlar mutlaka <strong>Key</strong> ve <strong>Value </strong>değerlerine ihtiyaç duymaktadır. Yani Cache' de duran veriyi işaret eden bir anahtar ile içerik bilgisi. Örnekte <strong>Cache </strong>üzerinde <strong>String </strong>bir içerik tutulmaktadır. Ancak karmaşık tiplerin tutulmasıda mümkündür. Söz gelimi geliştirici tarafından tanımlanmış bir nesne içeriğide <strong>Cache </strong>içerisinde tutulabilir. Nitekim özellikle <strong>Get </strong>metodunun dönüş tipine bakıldığında <strong>object </strong>olduğu görülmektedir. Buda zaten herşeyi açıklamaktadır.<img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> </p>
<p>Peki örneğimizi nasıl test edeceğiz? İşte örnek senaryo adımları;</p>
<ol>
<li>TextBox içerisine bir şehir adı(Örneğin İstanbul) girip Kaydet tuşuna basınız.</li>
<li>Programı kapatınız ve tekrardan çalıştırıp Getir tuşuna basınız.</li>
<li>Eğer Getir tuşuna bastıktan sonra 1nci adımda girdiğiniz Şehir adını TextBox içerisinde görüyorsanız sonraki adımdan devam ediniz.</li>
<li>TextBox içeriğinde değişiklik yapınız. Örneğin farklı bir şehir adı giriniz ve bu kez Güncelle tuşuna basınız.</li>
<li>Programı yine kapatıp açınız ve Getir tuşuna basarak 4ncü adımda yaptığınız güncellemenin getirildiğinden emin olunuz.</li>
<li>Şehir adını değiştirip veya aynı bırakıp tekrardan Ekle tuşuna basınız.</li>
<li>6ncı adımdan sonra <strong>"ErrorCode<ERRCA0010>:Cache::Add: An attempt is being made to create a object with a Key that already exists in the cache.Cache will only accept unique key value for objects."</strong> içerikli bir hata mesajı aldığınızdan emin olunuz<em>(Nitekim tekrar kaydetmek istediğiniz Key değeri zaten mevcuttur)</em></li>
<li>Uygulamayı kapatınız ve bir kaç dakika sonra<em>(tam olarak 300 saniye=5 dakika)</em> tekrar başlatıp Getir tuşuna basınız.</li>
<li>8nci adımdan sonra Cache içeriğinin TextBox' a gelmediğinden emin olunuz.</li>
</ol>
<p>Böylece geldik bir Hello World uygulamamızın daha sonuna. Bu konuda yeni bilgiler edindikçe sizlere paylaşmaya devam ediyor olacağım. Nitekim mimarisine baktığımızda son derece derin bir konu olduğunu farketmiş olmalısınız. Özellikle şu sıralar bir kaç Cluster Server' a kurulum yapıp Load Balancing ile ilgili testleri nasıl yapabileceğimi düşünmekteyim. Tabi bunun için öncesinden Environment' in tesis edilmesi gerekiyor. <img title="Undecided" src="/editors/tiny_mce3/plugins/emotions/img/smiley-undecided.gif" alt="Undecided" border="0" /> Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>
<p>Detaylı bilgi için <a href="http://msdn.microsoft.com/en-us/data/cc655792.aspx" target="_blank">tıklayın</a>. <br />CTP3 sürümünü <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B24C3708-EEFF-4055-A867-19B5851E7CD2&displaylang=en" target="_blank">Download </a>etmek için tıklayın.</p>
<p><a href="https://www.buraksenyurt.com/pics/2009%2f11%2fHelloVelocity.rar">HelloVelocity.rar (285,93 kb)</a></p>2009-12-11T00:25:00+00:00velocitymicrosoft distributed cachewindows server appfabricbsenyurtWeb uygulamalarında sıklıkla karşılaştığımız, Enterprise Library Caching Block sayesinde Web uygulaması sınırlarını aşarak diğer uygulamalarda daha kolay kullanılabilir hale gelmiş bu kavramın servis bazlı hale getirilebildiğini duysanız acaba ne düşünürdünüz Surprised İşte Microsoft' un uzun bir süre önce duyurduğu ve şu anda CTP 3 sürümü bulunan kod adı Velocity projesi...https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=027267af-0c4c-43ca-b965-a9f36d2714ad0https://www.buraksenyurt.com/trackback.axd?id=027267af-0c4c-43ca-b965-a9f36d2714adhttps://www.buraksenyurt.com/post/Microsoft-Distributed-Cache(Velocity-Project)-Hello-World#commenthttps://www.buraksenyurt.com/syndication.axd?post=027267af-0c4c-43ca-b965-a9f36d2714ad