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 Service Bus - Windows Phone 8.1

Windows Phone 8.1'den Azure'da bulunan Service Bus'daki bir queue'ya mesaj göndermek isteyebiliriz. Daha azınlıklı olarak mesajları almakta isteyebiliriz. Bunun için bir Worker Role, Web Role vs. yazıyor olsaydık, NuGet üzerinden WindowsAzure.ServiceBus download edip işimizi yapabilirdik. Ancak bu NuGet paketi Windows Phone 8.1'e uyumlu değil. Bunun yerine başka bir NuGet paketi indirmemiz gerekiyor.

   

Örneğin Queue ile nasıl mesaj alışverişi yapacağımıza bakalım.

  • Visual Studio Package Manager Console üzerinden Install-Package WindowsAzure.Messaging.Managed komutu ile projemize ekliyoruz.
  • Queue yaratmak ve silmek için aşağıdaki methodları kullanabiliriz.
    Microsoft.WindowsAzure.Messaging.Queue.CreateAsync();
    Microsoft.WindowsAzure.Messaging.Queue.DeleteAsync();
  • QueueClient nesnemizi yaratıyoruz.
    Microsoft.WindowsAzure.Messaging.Queue queueClient = 
    new Microsoft.WindowsAzure.Messaging.Queue("QueuePath",
     "Endpoint=sb://[namespace].servicebus.windows.net; 
    SharedSecretIssuer=owner;SharedSecretValue=someSecret");
    Mesaj Göndermek için SendAsync methodunu kullanıyoruz.

    await queueClient.SendAsync(new Microsoft.WindowsAzure.Messaging.Message("first message"));
    

       

  • Mesaj almak için ReceiveAsync methodunu kullanıyoruz.

    var result = await queueClient.ReceiveAsync();

   

  • Mesaj geldiğinde bir action'in çalışmasını istersek OnMessage methodunu kullanıyoruz.

    queueClient.OnMessage((message)=>{
                           //process message;
                       });

 

Benzer yöntem ile Topic / Subscription üzerinde mesaj göndermeniz ve almanız mümkün.