Azure Service Bus: Topic Subscription

Azure üzerinde ServiceBus adında bir hizmet olduğunu duymuşunuzdur diye tahmin ediyorum. Aslında Serbice Bus oldukça geniş ve çok işlevli bir konu ben bu yazıda sadece Topic & Subscription bölümünü kısaca özetleyeceğim.

   

Bu arada service bus sadace Azure üzerinde olan bir hizmet değil, kendi on-prem serveriniz üzerine kurup kullanabilirsiniz. Private cloud kavramıyla bu konuyuda inceleyebilirsiniz. Deneme fırsatım oldu, oldukca kolay bir kurulumu var.

   

Topic Nedir?

Sonuç olarak ingilizce bir terimden bahsediyoruz ve türkçesini düşünecek olursak: "KONU".

   

Subscription Nedir?

Aynı mantık ile üyelik diye biliriz.

   

Peki nedir bunlar? Konu çok basit aslında. Bir Topic olduğunu düşünün ve adı "Günlük Haberler" olsun. Birde subscriber olsun, ve bu topic'e subscribe olsun. Yani örneğin subscriber "Günlük Haberler" topic'ine üye oldu. Bu sayede "Günlük Haberler" topic'i içine giren her mesajdan subscriber haberdar olacaktır ve topic'e konulan mesajları okuyabilecektir.

   

Bir yada birden fazla üreticimiz var, topic'lerin içerisinde BrokeredMessage koyuyorlar.

Bir yada birden fazla subscriber(üye ?)'imiz var bunlarda topic'leri takip ediyor ve topic içine konulan mesajları okuyorlar konu bukadar basit.

   

Bahsettimiz işler Queue ilede yapılabilir mi? Şimdiye kadar evet diyebiliriz. Ancak Topic & Subscription mekanizmasında Topic ve Subscriptionlar var. Topic içine konulan her mesaj, belirlenen Topic'e subscribe etmiş tüm subscriberlara iletilmeyi garantiler. Queue'da ise mesaj queue'ya girer ve ilk alan consumer'in elinde kalır, ikinci vb. consumerlar o mesaja ulaşamazlar. Ama Subscription'da Topic'e giren her mesaj tüm subscriberlara iletilmeyi garanti eder.

   

Filtre

Subscriber topic'e subscribe olurken hangi mesajları almak istediğini filtreleyebilir. Bu işi şu şekilde yaparız, gelen mesajın propertylerinden biri veya bir kaçı belirtilen değerlerde ise mesaj ulaşsın. Bu yapı için SqlFilter class'indan yaralanıyoruz.

   

Connection String (config dosyasında olmalı)

   

<ConfigurationSettings>
<Setting name="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://[SERVICEBUSNAME].servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedSecretValue=KEY" />
</ConfigurationSettings>

   

Yeni Topic Yaratmak, C#

   

Topic'i Silmek, C#

   

Mesaj Göndermek, C#

   

Subscription Oluşturmak ve Mesajı Okumak

   

Receive methodu ile mesajları alabilirsiniz. Eğer geri dönen instance null ise topic içerisinde mesaj olmadığını anlayabilirsiniz.

   

   

   

OnMessage, C#

OnMessage() methodu ile yukarida kurduğumuz yapının otomatik olarak oluşmasını sağlayabilirsiniz ve verdiğiniz action mesaj geldiğinde çalışır. Böylece sizin while() gibi bir loop ile kontrol etmenize gerek kalmaz, mesaj geldiğinde verdiğiniz action call edilir.

   

   

   

Daha detaylı bilgi için,

   

http://azure.microsoft.com/en-us/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/#configuring-your-connection-string-when-using-websites-or-virtual-machines

   

http://www.4sln.com/Articles/microsoft-azure-service-bus-queue-topic-subscription

Azure Storage - Queue .Net SDK?

Daha önce kuyruk yapısının nasıl çalıştığından bahsetmiştim şimdi ise kod kısmına değinelim.

Kuyruk çok karmaşık bir yapı olmadığından dolayı kodlamasıda oldukça basit.

İlk önce tüm Azure servislerinde olduğu gibi bağlanmamız gerekli ardından ise bir kaç farklı method ile tüm işlerimizi halledebiliriz.

   

Bağlantı

   

// Storage Account bilgilerimizi AppSettingsden okuyoruz ve bir CloudStorageAccount instance'i olusturuyoruz

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);

   

// Kuyruk islemlerimiz icin bir CloudQueueClient yaratiyoruz

CloudQueueClient queueClient = storageAccount.CreateCloumdQueueClient();

// myqueue ismindeki kuyrugumun referansını alıyoruz

CloudQueue queue = queueClient.GetQueueReference("myqueue");

// eger myqueue yok ise yaratiyoruz.

queue.CreateIfNotExists();

   

Yeni Mesaj Ekleme

// yeni bir mesaj yaratıyoruz

CloudQueueMessage message = new CloudQueueMessage("First Message");

//Mesajı kuyruga ekliyoruz

queue.AddMessage(message);

   

PeekMessage

CloudQueueMessage peekedMessage = queue.PeekMessage();

// yukaridaki satir ile siradi mesaji okuduk ama mesaj hala kuyrukta kalmaya devam ediyor, sadece bir göz attık diyebiliriz.

   

Mesajı Alma ve Silme

// siradaki mesaji aldik.
CloudQueueMessage retrievedMessage = queue.GetMessage();

//mesaji isleyecek kodu buraya yaziyor.

//mesaji isledik ve isimzi bitti, mesaji kuyruktan siliyoruz.
queue.DeleteMessage(retrievedMessage);

   

Yukaridaki mesaj alma ve silme işleminde dikkat edilmesi gereken önemli bir nokta var,

GetMessage() komutundan sonra varsayılan olarak 30 saniyeliğine mesaj kuyrukta görünmez hale gelir ancak kuyruktan silinmez. Eğer 30 saniye icerisinde DeleteMessage() methodunu çağırmazsanız mesaj tekrar kuyrukta belirecektir. Buda mesajin tekrar işlenmesine sebep olacaktır.

   

Sınırlamalar

  • Bir mesaj en fazla 64 kb olabilir
  • Lease/Lock süresi: 7 gün maximum.
  • Queue maximum 200gb olabilir.
  • Bir mesaj kuyrukta en fazla 7 gün durabilir.
  • Saniyede maximum 2000 mesaj kuyruktan gecebilir.