RabbitMQ – Header Exchange

Merhaba,

Bu içeriğimizde mesaj kuyruk sistemi olan RabbitMQ’da kuyruktaki mesajların seçiciliğini arttırmak için kullanılan Header Exchange üzerine klavye oynatıyor olacağız.

Header Exchange Çalışma Mekanizması Nasıldır?

RabbitMQ - Header Exchange
Header Exchange için bir önceki makalemizde ele aldığımız Topic Exchange‘in key – value olarak tanımlanan halidir diyebiliriz. Yani anlayacağınız gönderilen mesajların routing key değerini topic exchange’de olduğu gibi .(nokta) ile değilde, ilgili mesajın header kısmından verilen key – value formatında değer ile oluşturarak, bu keylerle eşleşen kuyruklara ileten bir exchange türüdür.

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("headerexchange", type: ExchangeType.Headers);
                for (int i = 1; i <= 100; i++)
                {
                    byte[] bytemessage = Encoding.UTF8.GetBytes($"{i}. mesaj");

                    IBasicProperties properties = channel.CreateBasicProperties();
                    properties.Persistent = true;
                    properties.Headers = new Dictionary<string, object>()
                    {
                        ["no"] = args[0] == "1" ? "123456" : "654321"
                    };


                    channel.BasicPublish(exchange: "headerexchange", routingKey: string.Empty, basicProperties: properties, body: bytemessage);
                }
            }
        }

Yukarıdaki örnek kod bloğunda 16. satırı incelerseniz eğer gönderilecek mesaja dair gerekli ayarları yapmamızı sağlayan “IBasicProperties” türünden nesnemiz üzerinden “Headers” propertysine verilen ‘Dictionary’ koleksiyonunda ‘no’ keyine karşılık dışarıdan verilen argüman valuesuna göre ‘123456’ ya da ‘654321’ değerleri girilmektedir. Böylece ‘1’ argüman değeri verilen publisherlar {key :’no’, value :’123456′} header değerine eşdeğer routing key’e sahip kuyruklara mesaj iletecekken diğer argüman değerlerindeki publisherlar ise {key :’no’, value :’654321′} header değerindeki kuyruklara iletecektirler.

Consumer

Diğer exchange türlerine nazaran Header Exchange’te kuyruk manuel oluşturularak hazır hale getirilmelidir.

        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("headerexchange", type: ExchangeType.Headers);

                channel.QueueDeclare($"kuyruk-{args[0]}", false, false, false, null);

                channel.QueueBind(queue: $"kuyruk-{args[0]}", exchange: "headerexchange", routingKey: string.Empty, new Dictionary<string, object>
                {
                    ["x-match"] = "all",
                    ["no"] = args[0] == "1" ? "123456" : "654321",
                });

                channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);

                EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
                channel.BasicConsume($"kuyruk-{args[0]}", false, consumer);
                consumer.Received += (sender, e) =>
                {
                    Console.WriteLine($"{Encoding.UTF8.GetString(e.Body)}. mesaj");
                    channel.BasicAck(e.DeliveryTag, false);
                };
                Console.Read();
            }
        }

Yukarıdaki kod bloğuna göz atarsanız 11. satırda manuel bir kuyruk oluşturulmakta ve 13. satırda bu kuyruğa ilgili exchange ile birlikte header bilgileri set edilerek bind edilmektedir. Yine burada publisherda olduğu gibi verilen argüman değerine göre key – value verisindeki value kısmı belirlenecek ve eşleşen kuyruk hangisi ise mesajları o anki consumer tarafından tüketilecektir.

Burada header’a verilen ‘x-match’ key değerine dikkatinizi çekerim. ‘x-match’; ‘all’ veya ‘any’ olmak üzere iki değer alabilen ve fonksiyonel olarak header değerlerinden herhangi biriyle yahut hepsiyle eşleşme durumunu kontrol edip duruma göre ilgili consumerı ilgili kuyruğa subscribe eden bir niteliğe sahiptir.

Test

Uygulamayı derleyip çalıştırdığımızda hornet.rmq.cloudamqp.com adresindeki cloud servisine göz attığımızda header exchange’in oluşturulduğunu görebilmekteyiz.
RabbitMQ - Header Exchange

RabbitMQ - Header Exchange
Nihai olarak görüldüğü üzere kuyruklardaki key – value değeri ile eşleşen consumerlar ilgili mesajları tüketmekte ve işlemektedirler. Böylece publisherlar hedef consumerlara mesajı ileterek en başta vurguladığımız seçiciliği arttırmış ve iş bölümünü net sağlamış bulunmaktadırlar.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek projeyi indirebilmek için buraya tıklayınız.

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

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

*