Service Bus kavramını, Service-Oriented Architecture(SOA) yaklaşımı ile haşır neşir olanlar bir şekilde duymuş, hatta çeşitli tiplerini kullanmış bile olabilir. Service Bus kavramına, birbiri ile karşılıklı iletişim halinde olan, bu iletişimden dolayı çeşitli operasyonları paylaşan sistemleri tasarlamak ve geliştirmek için kullanılan bir model olarak çok yukarıdan bakabiliriz. Konuyu dağıtmamak için çok daha fazla derinlere girip Service Bus’ın ayrıntılarına girmek istemiyorum. Bu aşamada, bu basit tanım yeterli olacaktır.
Bu yazıda Windows Azure üzerindeki Service Bus’ı nasıl kullanabiliriz, hangi özelliklerinden nasıl faydalanabiliriz şeklinde, yine senaryo bazlı bir anlatımla, hem Windows Azure’u hem de Service Bus kavramını biraz anlatmaya çalışacağım. Hadi başlayalım…
Windows Azure’un sunduğu uygulama servislerinden biri de Service Bus. Bir birinden bağımsız ama ilişkili uygulamalar arasında iletişim kurmak adına kullanabileceğimiz bu servis kendi içinde, “Queue”, “Topics”, “Relay” ve şu an Preview olan “Notification Hub” şeklinde 4 alt kategoriye ayrılıyor. Bu yazıda “Topics” ile ilgili birşeyler paylaşıp, kullanım amacını özetlemeye çalışacağım.
Öncelikle Windows Azure’da ki Service Bus’ın “Topics” kavramı nasıl bir kavram bunu anlayalım. Publish/Subscription modeli olarak bilinen, bir sistemin yayınladığı şeyleri, bu sisteme üyelikle, üye olanların alabildiği bir model olarak ele alabiliriz “Topics”i…Bu modelde, sistemlerin yayınladığı/paylaştığı şeyler, direk olarak diğer sistemlere iletilmez. Yayınlanan şeyler, üye olanlara ara bir yapı ile iletilir. Bunun amacı, yayıncı ve alıcı arasındaki iletişimi bağımlılık değil de, ilişki şeklinde ele alabilmektir. İlişki kesildiği zaman iki sistem de, birbirlerine bağımlılığı olmadığı için işleyişlerini aksatmazlar. Windows Azure Service Bus’da bu ilişki “Topics”ler üzerinden yürütülmekte. Bir yayıncı bir “Topic”(konu diyelim) oluşturabiliyor. Windows Azure Service Bus sayesinde de, çeşitli client’lar, bu “Topic”e üye olup, bunun üzerinden ilişki sağlayabiliyor.
Biraz daha net olması adına, Queue kavramından örnek vermek isterim. Hem neden ihtiyaç olduğuna dair de netleşir belki. Queue kavramında, sıra mantığı işler bildiğiniz üzere. Sıraya konan verileri, bir istemci alır, daha sonra diğerini alacak şeklinde devam eder. Eğer veriyi başka bir istemci de almak isterse alamaz, çünkü o veri başka bir istemci tarafından alındığı için artık Queue’da değildir. Publish/Subsciption modelinde, paylaşılan veriyi üye olan herkes alabilir. Bu noktada “Topic”leri sıra mantığı olmayan ama Queue kavramına benzeyen kavramlar olarak ele alabiliriz.
Neyse bu kadar soyut şeyden biraz uzaklaşalım ve örneğimize geçelim. Şöyle bir senaryo oluşturalım; bir tane dergimiz olsun. Bu derginin sayılarını yaratalım çeşitli içerikle. Bu dergiye üye olanlar, yeni sayı çıktıkça ya da içerik eklendikçe üye oldukları için otomatikman haberdar olsunlar.
Öncelikle Windows Azure’da bunun için bir tane uygulama servisi,-ki bu Service Bus olacak, yaratmamız lazım. Bunun için Windows Azure Management Portal’dan aşağıdaki gibi bir Service Bus uygulamasını Topics alt kategorisi ile yaratmanız gerekmektedir.
Servisi oluşturduktan sonra şimdilik, bağlantı sağlayabilmeniz için gerekli bağlantı bilgilerini almanız yeterli olacaktır. Konfigurasyon dosyamızı aşağıdaki gibi oluştrabiliriz.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ServiceBusConnectionString" value="BURAYA WINDOWS AZURE SERVICE BUS İÇİN ENDPOINT BİLGİSİNİ YAZMANIZ GEREKMEKTE" /> </appSettings> </configuration>
Öncelikle IssueContent adında, içeriğimizi belirtebileceğimiz basit bir sınıf yaratalım.
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; namespace ServiceBus.Common { //Burada WCF ile uğraşmış kişilere çok tanıdık gelecek //Attribute'lar dikkatinizi çekecektir. //DataContract ve DataMember, paylaşılacak verinin //serialize edilip, service bus üzerinde paylaşılacak //olmasını belirtiyor. Eğer bu attribute'ları belirtmez //isek, kendi yarattığımız custom sınıfları Service Bus //üzerinden geçiremeyiz. [DataContract] public class IssueContent { [DataMember] public string Title { get; set; } [DataMember] public string Content { get; set; } public override string ToString() { return Title; } } }