Windows Azure Service Bus / Topics

Windows Azure Service Bus yapısından daha önceki yazımda bahsetmiştim. Haberleşme servisleri olarak kullanılacak güzel bir altyapı olarak sunulan Service Bus içerisinde Topics- Relay- Queue servisleri ile uygulamalarınız arasındaki iletişimleri çeşitli senaryolara göre düzenleyip Azure Platformu aracılığı ile gerçekleştirme imkanı sunulmaktadır.

Bu yazıda Service Bus – Topics kavramından kısaca bahsedip ufak bir demo ile devamlılığını sağlıyor olacağım. Service Bus Topics kavramı uygulamalarınız arasındaki haberleşme veya iletişimi çeşitli operasyonlara göre sağlıyor ancak diğer kavramlardan farklı olarak bu operasyonları sadece sizin uygulamanız içerisinde üye olan o uygulama tarafından kullanma yetkisi olan kişilere atamanızı sağlamaktadır. Yüzeysel olarak özetlemek gerekirse sadece sizin uygulamanıza üye olmuş kullanıcılara mesaj gönderebilirsiniz üye olmayan kullanıcılar gönderdiğiniz mesaj ve içeriklere ulaşamazlar diyebiliriz. Yığın olarak elde ettiğiniz tüm konuları içerikleri karşı tarafa gönderdiğiniz zaman bu yığın içerisindeki 1. konuyu uygulamayı kullanan tüm istemciler istediği gibi alır kullanır okur …

Kısa özet ardından demo işlemine geçebiliriz. Bunun için öncelikle herzaman olduğu gibi management portalımız üzerinden azure tarafına giriş yaparak yeni bir service bus – topics oluşturmamız gerekmektedir.

1 Service bus Topics servisini oluşturduktan sonra ” Connection Information ” kısmında projemiz ile servis arasında kurulacak olan bağlantı için gerekli Connection String sunulacaktır. 1 Yukarıdaki resimde görünen Connection String alanı, oluşturduğunuz Console Application projenizdeki App.Config alanına aşağıdaki gibi yerleştirilmelidir.


   <appSettings>
    <add key="SbConnectionString" value="Connection String Alanı Buraya Yerleştirilecek ..." />
  </appSettings>

Azure katmanındaki servisimiz ve projemiz arasındaki bağlantıyı sağladıktan sonraki aşamada yeni bir servis katmanı oluşturarak Topics altyapısı için içeriklerimizin oluşturulacağı bir servis oluşturmamız gerekmekte.

Daha öncesinde Servis Bus hizmetinin referanslarımızda ekli olması gerekmektedir. References kısmına sağ tıkladığımızda Manage NuGet Packages sekmesine girdikten sonra Search kısmına Service Bus yazarak Windows azure service bus referansını ekleyebiliriz. Referansları ekledikten sonra içeriklerimizin sağlanacağı class’ımızı oluşturabiliriz. Bunun için TopicsContent adında yeni bir class oluşturarak gerekli yapıyı kuruyoruz.

namespace ServiceBusTopicsTutorial.Common
{
    [DataContract]
    public class TopicsContent
    {
        [DataMember]
        public string Baslik { get; set; }

        [DataMember]
        public string Icerik { get; set; }

        public override string ToString()
        {
            return Baslik;
        }
    }

içerik sağlayacak olan sınıfı tamamladıktan sonra console tarafında programın azure service bus katmanı ile iletişimini sağlayarak içeriklerin altyapısını oluşturabiliriz.

Öncelikle Main tarafında oluşturmamız gereken Azure katmanı ile Connection sağlanması, bunun için App.config tarafında tanımladığımız Connection String value’su ile burada bir instance ile connection sağlanması gerekmektedir. Daha sonrasında yeni bir obje tanımlayarak Service Bus üzerindeki features için ihtiyacımız olan özelliği kullanmaya başlıyoruz. Service Bus’ın bize sunduğu özelliklerden Topics’i kullanacağımız için içeriklerin üyelik kavramıyla sağlanacağını unutmamamız gerekmektedir. Bunun için oluşturulan Topics’lerin kullanıcılara sunulmadan önce daha önce var olup olmadığının kontrolü açısından ServiceBusManager.TopicExists adında bir metod ile kontrolünü sağlayabiliriz. Böylece daha önceden aynı isimle topic oluşturduysanız tekrar aynı isimde bir topic oluşturulması engellenecek ve proje sürekliliği içerisinde topic sürekli açık kalarak kullanıcılara görünürlüğü sağlanacaktır.

string connectionString = CloudConfigurationManager.GetSetting("ServiceBusConnectionString");

            var ServiceBusManager = NamespaceManager.CreateFromConnectionString(connectionString);

            if (!ServiceBusManager.TopicExists("Konu 1"))
            {
                ServiceBusManager.CreateTopic("Konu 1");
            }

            if (!ServiceBusManager.SubscriptionExists("Konu 1", "WhatIsNew"))
            {
                ServiceBusManager.CreateSubscription("Konu 1", "WhatIsNew");
            }

Daha sonrasında Service Bus Topics kısmının önemli olan yapısı Üyelik sağlanacak. Bunun için üyelik alanı oluşturulacak ve bir Keyword kullanılarak üyelikler Service Bus üzerinde tutulacak böylece tutulan üyelikler üzerinden konuların ve içeriklerin dağıtımı sağlanacaktır. Ardından içeriklerimizi oluşturmak için TopicsContent class’ından bir obje oluşturuyoruz ve içeriklerimizi hazırlıyoruz. Oluşturulan bu içeriklerin Service Bus içerisinde tutulması için bir Client oluşturarak bu client üzerinden hangi konunun hangi bağlantı kullanacağına dair ayarları yapıyoruz. Servis Bus üzerinden göndereceğimiz mesaj Brokered Message olarak eşleşmektedir. Bu yüzden kendi oluşturduğumuz objede bulunan mesaj içeriklerini Brokered Message içerisine yerleştiriyoruz. Ancak Sealed bir class olduğundan dolayı custom mesaj türetmemiz mümkün olmamaktadır.

TopicsContent azureContent = new TopicsContent();
azureContent.Baslik = "Service Bus";
azureContent.Icerik = @"Service Bus - Topics Konusu anlatılıyor ...";

TopicsContent netFrameworkContent = new TopicsContent();
netFrameworkContent.Baslik = "Microsoft-Oracle Anlaşması";
netFrameworkContent.Icerik = @"Windows Azure için Microsoft, Oracle ile el sıkıştı ...";

TopicClient client = TopicClient.CreateFromConnectionString(connectionString, "Issue1");

BrokeredMessage issue = new BrokeredMessage(azureContent);

client.Send(issue);

issue = new BrokeredMessage(netFrameworkContent);

client.Send(issue);

Mesajımızın gönderileceği Sender kod bloğunu tamamladıktan sonra Reciever kısmına geçebiliriz. Reciever için sender kod bloğunda bulunan connection string kısmına tekrar ihtiyaç duyuyoruz çünkü alıcı için tekrar service bus hizmetine bağlanarak gerekli iletişimi kurmamız gerekmektedir. İkinci aşama olarak Topics kavramının temelini oluşturan subcriber, bunun için yeni bir subcriber client oluşturarak yukarda gönderdiğimiz Topics ile üye olan kişilerin eşleştirmesini sağlamamız gerekmektedir. Yani hangi konu hangi kullanıcıya gönderilecek gibi ufak bir detayı atlamamamız gerekmektedir. Client tarafını oluşturduktan sonra Service Bus hizmeti içerisinde barındırılan mesajlarımızı While döngüsü kullanarak çekebiliyoruz. Daha öncede bahsettiğim gibi Brokered message ile mesaj içerikleri tekrardan belirlenerek alınıyor ve GetBody metodu kullanılarak mesajımızı hangi tip üzerinden alabileceğimizi belirliyoruz. Mesajların toplanması bitirildikten sonra service bus hizmetinden alım işlemini complete metodu ile durduruyoruz.

var clientSb = SubscriptionClient.CreateFromConnectionString(connectionString, "Konu-1", "WhatIsNew");

            BrokeredMessage message = null;
            while (true)
            {
                message = clientSb.Receive(TimeSpan.FromSeconds(5));

                if (message != null)
                {
                    try
                    {
                        TopicsContent content = message.GetBody();

                        Console.WriteLine("Başlık : " + content.Baslik);
                        Console.WriteLine("İçerik : " + content.Icerik);

                        message.Complete();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        message.Abandon();
                    }
                }
            }

Programı çalıştırdığımız zaman console uygulamasındaki çıktıyı görebiliriz …

1

Yaptığımız işlemler ile sırasıyla oluşturduğumuz service bus hizmeti aracılığıyla gönderilen mesajlarımız azure ortamında Topics içerisinde tutularak gönderilmek istenen kullanıcılara iletilmesi sağlanıyor. Yaptığımız bu işlemlerin performans değerlendirmelerini Management Portal Üzerindeki Dashboard kısmında görebilirsiniz.

1


Yorum bırakın