RabbitMQ #4— Fanout Exchange

Cenker Kumlucalı
5 min readJul 18, 2023

--

Exchange ve Binding’e Hızlı Bir Göz Gezdirme

Önceki bölümlerde Exchange ve Binding kavramlarını ele almıştık. Exchange, mesajları alır ve ilgili kuyruklara yönlendirirken Binding, Exchange ve kuyruklar arasında ilişki kurar. Bu sayede mesajlar, doğru hedefe iletilir. Fanout exchange, bu Exchange ve Binding mekanizmasını kullanarak geniş yayın yapma işlevselliği sağlar.

Fanout Exchange: Herkese Aynı Mesajı Yayma

Fanout exchange, RabbitMQ’nun mesajları tüm kuyruklara geniş bir şekilde yayınlayan bir exchange türüdür. Bu exchange türü, gelen mesajları hedef kuyruklara doğrudan yönlendirmez, bunun yerine mesajları aynı anda tüm kuyruklara ileterek geniş yayın yapar.

Fanout exchange’in çalışma prensibi oldukça basittir. Bir yayıncı (publisher) mesajı fanout exchange’e gönderir. Fanout exchange, mesajı alır ve abone olan tüm kuyruklara kopyalarını gönderir. Yani, bir mesajı gönderen herkes bu mesajı alır. Bu sayede, fanout exchange mesajı geniş bir kitleye yayarak iletişimi kolaylaştırır.

Fanout exchange kullanmanın birçok farklı senaryosu vardır. İşte bazı örnekler:

  1. Toplantı Duyuruları: Bir şirketin tüm çalışanlarına bir toplantı duyurusu yapmak istediğinizi hayal edin. Fanout exchange sayesinde, toplantı duyurusu mesajı tüm çalışanların kuyruklarına iletilir ve herkes bu mesajı alır. Böylece, tüm çalışanları aynı anda bilgilendirebilir ve toplantıya katılımı artırabilirsiniz.
  2. Sosyal Medya Paylaşımları: Bir sosyal medya platformunda bir gönderiyi tüm takipçilere duyurmak istediğinizi düşünün. Fanout exchange kullanarak, gönderiyi paylaştığınızda bu mesaj tüm takipçilerin kuyruklarına iletilebilir. Bu sayede, herkes paylaşımınızı görür ve etkileşimde bulunabilir.

Fanout exchange, iletişimi kolaylaştırarak mesajların geniş bir kitleye ulaşmasını sağlar. Bu, anlık duyurular, yayınlar veya genel bildirimler gibi senaryolarda oldukça faydalıdır. Fanout exchange kullanarak mesajları herkese eşit şekilde iletebilir ve tüm katılımcıların aynı bilgiye sahip olmasını sağlayabilirsiniz.

Unutmayın, fanout exchange tüm kuyruklara geniş yayın yaparken, mesajların hedef kitleye uygun olduğundan emin olmanız önemlidir. Bu sayede, herkesin ilgili ve değerli bilgiler almasını sağlayabilirsiniz.

Fanout exchange, RabbitMQ’nun güçlü bir özelliği olup, mesaj tabanlı sistemlerde iletişimi etkinleştirmek için kullanılır. Doğru senaryolarda fanout exchange’i kullanarak, mesajlarınızı tüm katılımcılara eşit ve adil bir şekilde iletebilirsiniz.

Senaryo 1: Haber Bildirimleri

Bir haber yayını senaryosunu ele alalım. Bir haber ajansı, farklı konularda haberlere abone olan müşterilere anlık bildirimler göndermek istiyor. Bu durumda, fanout exchange türünü kullanarak haberleri yayınlamak ve abonelerin bu haberleri almasını sağlamak mümkündür. Her bir abone için ayrı bir kuyruk oluşturulur ve fanout exchange, haberleri bu kuyruklara yayınlar. Aboneler, kendi ilgilendikleri konularda haber bildirimlerini alır.

İşte bir örnek kod senaryosu:

using RabbitMQ.Client;
using System;
using System.Text;

public class Publisher
{
private const string ExchangeName = "NewsExchange";

public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, ExchangeType.Fanout);

while (true)
{
Console.Write("Enter a news category: ");
var category = Console.ReadLine();

Console.Write("Enter the news message: ");
var message = Console.ReadLine();

var payload = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(ExchangeName, "", null, payload);

Console.WriteLine("News published successfully!");
Console.WriteLine();
}
}
}
}

Yukarıdaki örnekte, Publisher sınıfı haberleri fanout exchange’e göndermek için RabbitMQ bağlantısını kullanır. ExchangeName sabit değişkeni, haberlerin yayınlandığı fanout exchange’in adını temsil eder. Kullanıcıdan alınan kategori ve mesaj bilgisi, bir mesaj olarak fanout exchange’e yayınlanır.

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

public class Subscriber
{
private const string ExchangeName = "NewsExchange";

public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, ExchangeType.Fanout);

var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queueName, ExchangeName, "");

var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var newsMessage = Encoding.UTF8.GetString(ea.Body.ToArray());
Console.WriteLine($"Received news: {newsMessage}");
};

channel.BasicConsume(queueName, true, consumer);

Console.WriteLine("Waiting for news...");
Console.ReadLine();
}
}
}

Yukarıdaki örnekte, Subscriber sınıfı haberleri almak için RabbitMQ bağlantısını kullanır. ExchangeName sabit değişkeni, haberlerin yayınlandığı fanout exchange’in adını temsil eder. Kuyruk oluşturulur ve fanout exchange ile bağlantı kurulur. Haberler alındığında, mesajın içeriği konsola basılır.

Bu örnekte, haber bildirimlerini geniş yayın yapmak için fanout exchange senaryosunu ele aldık. Her bir abone için ayrı bir kuyruk oluşturarak, haberlerin doğru hedefe ulaşmasını sağladık.

Senaryo 2: Sistem Durumu Bildirimleri

Bir sistem yönetimi senaryosunu düşünelim. Sistemdeki farklı bileşenlerin durumunu takip etmek ve bu durumları ilgili ekiplere bildirmek istiyoruz. Fanout exchange türünü kullanarak her bir ekip için ayrı bir kuyruk oluşturabiliriz. Sistem durumu güncellendiğinde, fanout exchange bu güncellemeleri tüm kuyruklara yayınlar. Böylece her ekip, kendi sorumluluk alanıyla ilgili durum bildirimlerini alır ve gerektiğinde müdahalede bulunabilir.

İşte bir örnek kod senaryosu:

using RabbitMQ.Client;
using System;
using System.Text;

public class SystemStatusPublisher
{
private const string ExchangeName = "SystemStatusExchange";

public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, ExchangeType.Fanout);

while (true)
{
Console.Write("Enter the system component: ");
var component = Console.ReadLine();

Console.Write("Enter the status message: ");
var message = Console.ReadLine();

var payload = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(ExchangeName, "", null, payload);

Console.WriteLine("System status updated successfully!");
Console.WriteLine();
}
}
}
}

Yukarıdaki örnekte, SystemStatusPublisher sınıfı sistem durumu güncellemelerini fanout exchange’e göndermek için RabbitMQ bağlantısını kullanır. ExchangeName sabit değişkeni, sistem durumu güncellemelerinin yayınlandığı fanout exchange’in adını temsil eder. Kullanıcıdan alınan bileşen ve durum bilgisi, bir mesaj olarak fanout exchange’e yayınlanır.

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

public class SystemStatusSubscriber
{
private const string ExchangeName = "SystemStatusExchange";

public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, ExchangeType.Fanout);

var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queueName, ExchangeName, "");

var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var systemStatus = Encoding.UTF8.GetString(ea.Body.ToArray());
Console.WriteLine($"Received system status: {systemStatus}");
};

channel.BasicConsume(queueName, true, consumer);

Console.WriteLine("Waiting for system status updates...");
Console.ReadLine();
}
}
}

Yukarıdaki örnekte, SystemStatusSubscriber sınıfı sistem durumu güncellemelerini almak için RabbitMQ bağlantısını kullanır. ExchangeName sabit değişkeni, sistem durumu güncellemelerinin yayınlandığı fanout exchange’in adını temsil eder. Kuyruk oluşturulur ve fanout exchange ile bağlantı kurulur. Sistem durumu güncellemeleri alındığında, mesajın içeriği konsola basılır.

Bu örnekte, sistem durumu güncellemelerini geniş yayın yapmak için fanout exchange senaryosunu ele aldık. Her bir ekip için ayrı bir kuyruk oluşturarak, sistem durumu güncellemelerinin doğru hedefe ulaşmasını sağladık.

Keyifli okumalar! 😊

--

--

No responses yet