Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

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?

RabbitMQ - Direct Exchange

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.
RabbitMQ - Direct Exchange

RabbitMQ - Direct Exchange
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…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 03 Mart 2020

    […] RabbitMQ – Direct Exchange […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*