Mehmet Oya

Hap Bilgi 13: Azure Service Bus Queue ve Topic Arasındaki Fark

Jul 29, 2024
4 minutes

Developer hap bilgi sever; 13. bölüm: Azure Service Bus Queue ve Topic Arasındaki Fark. Azure Service Bus, sistemlerinizde asenkron mesajlaşmayı uygulamak için harika bir araçtır. Ancak, Azure Service Bus Kuyruk (Queue) ve Konu (Topic) arasındaki farkı anlamak birçok kişi için zor olabilir. Bu yazıda, Azure Service Bus Kuyruk ve Konu arasındaki farkı basit ve pratik bir kurulumla göstereceğim. Ayrıca, bir Azure Service Bus kuyruğunu ne zaman ve bir Azure Service Bus konusunu ne zaman kullanmak isteyebileceğinize dair bazı pratik referanslar da vereceğim.

Azure Service Bus Nedir?

Azure Service Bus, bulut tabanlı uygulamalarınız arasında güvenli ve güvenilir iletişimi sağlamak için kullanılan bir mesajlaşma hizmetidir. Bu hizmet, farklı bileşenler arasında iletişim kurarken asenkron mesajlaşma yöntemlerini destekler. Bu sayede, uygulamalarınızın birbirinden bağımsız çalışmasına ve performansın artmasına yardımcı olur.

Azure Service Bus Kuyruğu (Queue)

Azure Service Bus Kuyruğu, bir dizi işlemi sıraya koyarak işlemleri birbiri ardına işleme koymak için kullanılır. İstemci, kuyruğa bir mesaj gönderir ve alıcının bu mesajı alıp işlemesini bekler. Mesaj, yalnızca bir kez alıcı tarafından işlenir ve kuyruktan kaldırılır. Özellikle FIFO (First-In-First-Out) mantığına dayalı bir sıralama sağlar.

Azure Service Bus Kuyruğu Kullanım Senaryoları:

  • Yük Dengeleme: Birden fazla işleyiciye (worker) sahip bir sistemde, işleri dengelemek ve sıralı bir şekilde işlemek için kullanılır.

  • Hata Toleransı: Mesajlar kuyruğa eklenir ve alıcı tarafından işlenmeden kuyrukta saklanır. Alıcı hatası durumunda mesajlar kaybolmaz.

  • Tek Alıcı İşlemleri: Sipariş işleme veya bilet rezervasyonu gibi işlemlerde tek bir alıcı tarafından işlenmesi gereken işler için uygundur.

// Mesaj gönderme
QueueClient queueClient = new QueueClient(connectionString, queueName);
string messageBody = "This is a message to the queue";
var message = new Message(Encoding.UTF8.GetBytes(messageBody));
await queueClient.SendAsync(message);

// Mesaj alma
MessageReceiver messageReceiver = new MessageReceiver(connectionString, queueName);
Message receivedMessage = await messageReceiver.ReceiveAsync();
string receivedMessageBody = Encoding.UTF8.GetString(receivedMessage.Body);
Console.WriteLine($"Received message: {receivedMessageBody}");

C#

Azure Service Bus Konusu (Topic)

Azure Service Bus Konusu, birden fazla alıcıya (abone) mesajların iletilmesini sağlayan bir iletişim mekanizmasıdır. Bir gönderici, bir konuya mesaj gönderir ve bu mesaj, tüm abonelere iletilir. Aboneler, konuyu dinleyerek belirli türdeki mesajları alabilir ve işleyebilir. Bu, bir yayın/abone (publish/subscribe) modeline dayanır.

Azure Service Bus Konusu Kullanım Senaryoları:

  • Olay Temelli Sistemler: Bir olayın birden çok aboneye iletilmesi gereken sistemlerde kullanılır (örneğin, bir ürün güncellemesi veya yeni bir kullanıcı kaydı).
  • İşleme ve İş Akışı Yönetimi: Farklı iş adımlarının birbirinden bağımsız olarak çalıştığı durumlarda kullanılır.
  • Farklı Mesaj Türleri: Farklı mesaj türlerini farklı abonelere iletmek için uygundur.
// Mesaj gönderme
TopicClient topicClient = new TopicClient(connectionString, topicName);
string topicMessageBody = "This is a message to the topic";
var topicMessage = new Message(Encoding.UTF8.GetBytes(topicMessageBody));
await topicClient.SendAsync(topicMessage);

// Abone olma ve mesaj alma
SubscriptionClient subscriptionClient = new SubscriptionClient(connectionString, topicName, subscriptionName);
MessageHandlerOptions messageHandlerOptions = new MessageHandlerOptions(ExceptionHandler)
{
    MaxConcurrentCalls = 1,
    AutoComplete = false
};

subscriptionClient.RegisterMessageHandler(async (message, token) =>
{
    string receivedTopicMessageBody = Encoding.UTF8.GetString(message.Body);
    Console.WriteLine($"Received message from topic: {receivedTopicMessageBody}");
    await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
}, messageHandlerOptions);

Task ExceptionHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
{
    Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
    return Task.CompletedTask;
}
C#

Azure Service Bus Kuyruk ve Konu Arasındaki Farklar

a. Kuyruk

  • Mesajlar bir kez alınır ve işlenir.
  • FIFO mantığına göre sıralanır.
  • İşlemler genellikle tek bir alıcı tarafından yapılır.

b. Konu

  • Mesajlar birden fazla aboneye iletilir.
  • Yayın/abone modeline göre çalışır.
  • Mesajlar aboneler tarafından dinlenir ve işlenir.

Sonuç

Azure Service Bus Kuyruk ve Konu, asenkron iletişimde kullanılan iki önemli araçtır. Kuyruk, işlemleri sıraya koyarak güvenli bir şekilde işlemek için idealdir. Konu ise birden fazla alıcıya mesajların iletilmesi gereken durumlar için uygundur. Her iki yöntemin de kendi kullanım senaryoları vardır ve hangi yöntemin kullanılacağına karar verirken bu senaryoları dikkate almak önemlidir.

Her zaman olduğu gibi kaynaklara mutlaka göz atılmasını tavsiye ediyorum.⬇️