RabbitMQ – Direct Exchange
Merhaba,
RabbitMQ yazı dizimizde exchange türleri arasından sıra Direct Exchange’e gelmiş bulunmaktadır. Şimdi gelin hiç vakit kaybetmeksizin ilgili exchange’i inceleyelim.
Direct Exchange İşleyişi Nasıldır?
Publisherın göndereceği mesajı istediği consumer(lar)a iletilmesini sağlayan ve böylece hedef tüketiciye veriyi işleten bir işleyişe sahip exchange’tir. Bunun için mesaja bir Routing-Key değeri verilmekte ve bu routing-key değerine sahip tüm kuyruklara mesajın iletilmesi sağlanmaktadır.
Direct Exchange, mesajı direkt olarak ilgili adrese anahtar teslim yapmaktadır diyebiliriz.
Kullanımı
Publisher
static void Main(string[] args)
{
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = new Uri("amqp://hkhjerrt:hcqiavAqll6-co4abXnSqUBh_hHifz-Z@hornet.rmq.cloudamqp.com/hkhjerrt");
using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
channel.ExchangeDeclare("directexchange", type: ExchangeType.Direct);
for (int i = 1; i <= 100; i++)
{
byte[] bytemessage = Encoding.UTF8.GetBytes($"sayı - {i}");
IBasicProperties properties = channel.CreateBasicProperties();
properties.Persistent = true;
if (i % 2 != 0)
channel.BasicPublish(exchange: "directexchange", routingKey: "ciftsayilar", basicProperties: properties, body: bytemessage);
else
channel.BasicPublish(exchange: "directexchange", routingKey: "teksayilar", basicProperties: properties, body: bytemessage);
}
}
}
9. satıra göz atarsanız eğer “ExchangeDeclare” metodunun ‘type’ parametresini ‘ExchangeType.Direct’ değeri ile Direct Exchange olarak ayarlamaktayız. 16 ile 19. satırlar arasına göz atarsanız eğer döngüyle üretilen mesajları çiftlik yahut teklik durumuna göre declare edilen ilgili exchange üzerinden ilgili route-keylerle işaretleyerek kuyruğa gönderiyoruz.
Böylece artık tek sayılarımız “teksayilar” routingKey’ine sahip kuyrukta tutulurken çift sayılar ise “ciftsayilar” kuyruğuna gönderilecektir. Bu yapılanmadan sonra artık consumerlarımızın bir kısmı “teksayilar” route-key’ine sahip kuyruğu dinlerken, bir kısmıda “ciftsayilar” route-key’ine sahip kuyruğu dinleyecektirler. Böylece hangi kuyruğa mesaj gelirse onu dinleyen consumerlar devreye girecek ve tüketim/işleyiş başlayacaktır.
Consumer
static void Main(string[] args)
{
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = new Uri("amqp://hkhjerrt:hcqiavAqll6-co4abXnSqUBh_hHifz-Z@hornet.rmq.cloudamqp.com/hkhjerrt");
using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
channel.ExchangeDeclare("directexchange", type: ExchangeType.Direct);
string queueName = channel.QueueDeclare().QueueName;
if (int.Parse(args[0]) == 1)
channel.QueueBind(queue: queueName, exchange: "directexchange", routingKey: "teksayilar");
else
channel.QueueBind(queue: queueName, exchange: "directexchange", routingKey: "ciftsayilar");
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
channel.BasicConsume(queueName, false, consumer);
consumer.Received += (sender, e) =>
{
Console.WriteLine(Encoding.UTF8.GetString(e.Body) + " sayısı alındı.");
channel.BasicAck(e.DeliveryTag, false);
};
Console.Read();
}
}
9. satırda yine “ExchangeDeclare” metodu ile türü Direct Exchange olan bir exchange declare ediyoruz. 12 ile 15. satır aralığında ise ‘1’ argüman değerine sahip olan consumerların “teksayilar” routing-key değerine sahip kuyruğu, ‘2’ argüman değerine sahip olanların ise ‘ciftsayilar’ keyli kuyruğu dinlemesini belirtiyoruz.
Test
Uygulamayı derleyip çalıştırdığımızda hornet.rmq.cloudamqp.com adresindeki cloud servera göz atarsak eğer ilgili exchange’in oluşturulduğunu görmekteyiz.


Evet görüldüğü üzere mesajlar router-key hedeflerine uygun tüm kuyruklara iletilmekte ve ilgili consumerlar tarafından anında tüketilmektedirler…
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…


1 Cevap
[…] RabbitMQ – Direct Exchange […]