Azure Cloud Service

Azure Cloud Service'i bir container olarak düşünebiliriz. CloudService projesine bağlı iki farklı tipte proje olabilir bunlar Worker Role ve Web Role'dür. Ayrıca ServiceConfiguration.Cloud.cscfg, ServiceConfiguration.Local.cscfg, ServiceDefinition.csdef gibi config dosyaları barındırır. Her Web Role ve Worker Role için en az bir VM yaratılır ve birbirlerinden bağımsız olarak scale edilebilirler. Ayrıca connection string gibi bilgiler projelerin App Config veya Web Config dosyalarında değil ServiceConfiguration dosyalarında bulunur. Böylece tüm worker role ve web role instance'ları aynı configuration dosyalarını okuyabilirler.

Kısaca Worker Role ve Web Role ne demek bakalım.

   

Worker Role

Worker Role, sürekli olarak çalışan bir programdır. Azure üzerinde bir sanal makineye deploy edeilir ve kendi kendine çalışır eğer bir sebepten dolayı (exception vb.) program kapanırsa otomatik olarak yeniden başlatılır.

İçerisinde bir kaç default method barındırır. OnStart(), Run(), OnStop(). Her worker role class'i RoleEntyPoint class'inden inherit ettiği için bu methodları ovveride olarak barındırır. Bu methodlar nedir kısaca bakmak gerekirse; OnStart(), worker role ilk çalıştığında çalışır ve genelde connection'lari başlatmak gibi işlemler için kullanılır. OnStart() methodundan sonra Run() methodu çağırlır ve asıl iş burada döner, her hangi bir sebebten ötürü program kapanacak olursa OnStop() methodu çağırılır ve bu method içerisinde açılan connectionların kapatılması gibi işlemler yapılır. Bu methodlar Azure tarafından otomatik olarak çağırılmaktadır. Asıl bizim için önem taşıyan method Run() methodudur. Bu methodun hiç sonlanmayacağını düşünmeliyiz. Çünkü eğer bu method tamamlanırsa ardından OnStop() çağırılır ve program kapanır. Ardından otomatik olarak Azure tarafından tekrar program başlatılır. Bu sebebten dolayı Run methodu hiç bitmeyecek şekilde tasarlanmalıdır. Örneğin while(true) gibi bir sonsuz döngü barındırmalıdır veya ManualResetEvent.WaitOne() gibi bir method ile bekletilmelidir.

Visual studio içerisinde bir kaç farklı tipte Worker Role proje template'i olsada aslında olay hep yukarıda anlattığım kadardır.

   

Worker Role nasıl bir senaryoda işimize yarar?

Örneğin bir Queue var ve client uygulamalarımız sürekli olarak bu queue'ya mesaj gönderiyor. Bir programın bu queue'dan gelen mesajı okuyup işlemesi gerekir ve devamında bir takım işlemleri yapması gerekir. Bu durumda WorkerRole sürekli çalışan bir program yapısında olduğundan sürekli olarak Queue'yu dinlemesi mümkündür ve queue'ya herhangi bir mesaj geldiğinde gelen mesajı işleyip ardından bir sonraki mesajı alabilir. Queue hakkında detaylı bilgiyi buradan ulaşabilirsiniz.

   

Web Role

Web Role aslında bir Asp.Net projesinden fazlası değildir. Normal bir Asp.Net projesinden fazla olarak içerisinde WebRole.cs adında bir class barındırır. Bu class aynı Worker Rolede olduğu gibi RoleEntityPoint'ten inherit edilmiştir. Böylece OnStart() gibi methodlar ile durumları handle etmeniz mümkün.

   

Configuration Dosyaları

   

Cloud service projesi içerisinde 3 tane configuration dosyası bulunur. Bunlar ServiceConfiguration.Cloud.cscfg, ServiceConfiguration.Local.cscfg ve ServiceDefination.csdef. Aslına bakılırsa ServiceDefinition.csdef bir configuration dosyası değildir bir tanımlama dosyasıdır.

Cloud Service

   

ServiceDefinition.csdef dosyasında tüm WebRole ve WorkerRole'lerimiz için ayarlar bulunur.

ServiceDefinition.csdef

Yukarıda gördünüz gibi bir WebRole tagi'i ve birde WorkerRole tagi'i bulunuyor.

Worker Role tag'ine baktığımızda name ve vmsize isimli iki property görüyoruz. VMSIZE property'si şuanda Small olarak set edilmiş durumda, azure ClouldSample.CloudService.WorkerRole'u host etmek yaratacağı VM(leri) Small size'da yaratacaktır. Siz buradan bunu değiştirebilirsiniz. Aynı ayar WebRole içinde mevcut, ancak web role için daha çok ayar görüyoruz, port ve protocol gibi bunları buradan değiştirebilirsiniz. Ayrıca eğerki webconfig dosyasında olduğu gibi istediğiniz başka bir ayarı eklemek isterseniz, öncelikle key değerimizi bu dosyaya yazmamız gerekiyor. Örneğin ben WorkerRole için Key1 isimli bir setting tanımladım ancak değerinin ne olduğu bu dosyada belirtilmiyor.

   

Gelelim cscfg dosyalarına

Cloud.cscfg

Bu dosyalardan iki tane mevcut bir tanesi Cloud.cscfg diğer ise Local.cscfg. Ancak dosyaların şemaları aynı. Bunu web configteki debug config ve release config dosyası olarak düşünebilirsiniz. Localde emulator üzerinde çalıştırırsanız Local.cscfg dosyası yükleniyor cloud üzeirnde çalışırsa Cloud.cscfg dosyası yükleniyor. Bunları değiştirmeniz mümkün.

Dosyanın içeriğine baktığımızda yine her role için bir tag olduğunu görüyoruz ve önemli olarak Instances tagi bulunmakta. Bu tagin count property'si ile kaç insantance yaratılacağını belirliyoruz. Böylece ServiceDefination.csdef dosyasında bulunan sizede ve bu dosyada bulunan sayıda intance yaratılır. Bu ayarı buradan değiştirebilir. Ayrıca ServiceDefiniation.csdef dosyasında bulunan setting değerleri bu dosyaların ikisindede mecburen olmalı. Gördüğünüz gibi ben Key1 için Value1 olarak bir değer bildirdim.

   

Bu dosyaları xml olarak düzenlemek istemezseniz. CloudService altında bulnan Roles içerisnde role'ün üzerine çift tıklayarak bir editor açabilirsiniz ve buradan Instance size veya settings veya endpoint gibi bir çok ayarı yönetebilirsiniz.

   

Cloud Service nasıl oluşturulur?

Visual Studio üzerinden Create New Project'e tıklayacak açılan pencerede Templates-> Cloud ve Azure Cloud Service'i seçiyoruz.

Create Cloud Service

   

Karşınıza aşağıdaki ekran gelecektir. Ve bu pencerede service'imize Role ekliyoruz.Ben aşağıdaki örnekte Bir Worker Role birde Web Role ekledim.

   

Role Ekleme

Tabiki daha sonra yeni role ekleme imkanımızda olacaktır. Daha sonra karşınıza Web Role için seçeneklerin olduğu bir pencere çıkacaktır. Buradan Web Forms, MVC, Web Api gibi template'lerden birini seçerek devam ediyoruz. Ben bu örnekte MVC seçiyorum ve Authenction olarak No Authentication diyorum böylece herhangi bir authentication mekanızmaması olmayacak.

   

Worker Role & Web Role & Queue kullanan bir örneği yakında yayınlayacağım.

   

   

Azure Storage - Queue Nedir?

   

Azure Storage servisleri içerisinde Queue, Blob, Table, File(preview) gibi farklı depolama seçenekleri var, ben bu post'ta Queue'ya değineceğim.

Nedir bu Queue?

Queue, türkçede kuyruk.

Bilgisayar mühendisliği veya benzeri bölümler okuyan arkadaşların iyi hatırlayacağı üzere queue(kuyruk) bir abstract data type (ADT), aslında bakarsanız Azure üzerinde kuyruk kullanmak o derste öğretilen kadar zor ve karmaşık değil.

   

Yukarıdaki resim MSDN'den aldığım bir image ve bence kuyruğu en iyi ifade eden görsellerden biri.

Öncelikle bileşenleri tanıtıyım,

  • Solda görmüş olduğunuz Web Role -> bildiğiniz web sitesi
  • Orta ve aşağıdaki Windows Azure Queue -> türkçesi kuyruk, bu arkadaşın nasıl çalıştığını anlamaya çalışıyoruz.
  • Sağdaki Worker Role -> basit olarak anlatmak gerekirse sürekli çalışan bir program.

   

Yukarıdaki görselde gördüğünüz gibi kuyruğa sürekli web sitesi tarafından bir şeyler ekleniyor ve worker role bunları okuyup işliyor. Tam olarak üniversitelerde öğrenmiş olduğumuz kuyruk yapısı gibi "FIFO" first-in-first-out çalışmıyor aslına bakarsanız. Buna daha sonra değiniriz.

   

Örnek senaryo

Bir e ticaret sitemiz olduğunu düşünelim ve kullanıcı ödeme işlemenini yaptıktan sonra 3 farklı işlem yapılması gerektiğini düşünelim.

  • Satış stok takip programına işlenmeli
  • Kargo firmasının api'lari ile işlem yapılmalı
  • Kullanıcıya mail atılmalı

Bu işlemlerin hepsi kullanıcı ödemesini tamamladıktan sonra yapılmalı. Baktığımızda bu işi buton'a basıldığında yapabiliriz diye düşünebiliriz ancak gerçekte iş biraz daha karışık. Butona basıldığı anda bu kadar işi bir anda yaparsanız kullanıcı cok fazla bekler belkide request timeout olur. Bu işlemlerden bazıları o anda teknik sebeplerden ötürü yapılamaya bilir ve sizin bir retry logic kurmanız gerebilir. Bu konuların hepsinden kaçınıp kuyruk kullanarak bu senaryoyu başarabiliriz.

Nasıl yapmalıyız?

Kullanıcı ödeme işlemini tamamladığından bu satış işleminin identifier'ini web sitesi kuyruğa koyar. Worker role bu kuyruğu sürekli kontrol eder ve satış bilgisi geldiği anda yukarıdaki 3 adımı sırası ile gerçekleştirir. Eğer bir hata oluşursa otomatik olarak kuyruğa tekrar ekler ve ilerleyen zamanlarda tekrar dener.

   

Dizayn olarak bakacak olursak, bu yapıyı kullanarak sistemlerimizi birbirinden bağımsız hale getirirerek daha iyi bir mimari dizayn ortaya koyabiliriz. Örneğin bizim birden çok e ticaret sitemiz var ancak hepsi için az önce yukarıda anlattığımız senaryo aynı, bütün siteler tek depo ile çalışıyor ve aynı kargo firması ile çalışıyor. Bu durumda farklı web sitelerimiz aynı kuyruğa mesaj koyabilir ancak okuyacak worker role bunların nereden geldiğini önemsemeden alır ve işler böylece sistemimiz daha güzel bir mimariye sahip olmuş olur. Sistemin bileşenleri arasında bağımlılık en aza indirilmiş olur. Keyword: decoupling

   

Azure Queue'da mesaj aynı anda sadece bir alıcıya ulaşır. Yani eğer sizin iki tane worker role'unuz var ve aynı kuyrugu kontrol ediyorsa bunlardan biri mesajı alır ve diger alamaz. Birbirlerinden mesajları çalarak ilerlerler. Eğer sisteminizde bir worker role yetmiyorsa ikinci worker role'u eklerseniz sisteminizin çalışma hızı yaklaşık 2 ye katlanmış olur. Eğer mesajların aynı anda iki worker role'ede iletilmesini istiyorsanız Service Bus'ı kullanmayı düşünmelisiniz.