RabbitMQ – Topic Exchange

Selamlar, bu makalede Topic Exchange üzerine konuşuyor olacağız. Bir önceki makalede Direct Exchange konusuna değinmiştik. Exchange yapılarının birbirleri arasındaki farkı anlamak çok önemli. Kullanım ihtiyacı duyulduğunda hangi exchange yapısının tercih edileceği geliştireceğiniz iş ve buna cevap veren exchange yapısı hangisi şeklinde belirlenmektedir. Direct Exchange ile Topic Exchange arasındaki temel farkı anlamak için Direct Exchange yazımı okumanızı tavsiye ederim.

Topic Exchange yine diğer exchange yapıları gibi mesajları alan ve ilgli kuyruklara parametre olarak verilen routingKey değerlerine göre dağıtımı gerçekleştiren yapılardır. Çalışma mantığı ve tanım olarak Direct Exchange yapısından hiç bir farkı yok gibi gözükse de aslında önemli fark routingKey parametresi geçilirken belli bir syntax’a sahip bir string geçebiliyor olmamız.

Direct Exchangede tek bir routing key belirleyebiliyorken Topic Exchange de oluşturmuş olduğumuz string sayesinde bize şablon routingKey geçebilmemizi sağlıyor.Bu avantajının yanında mesajların okunması esnasında “*” ,”#” gibi karakterler ile routingKey’i özelleştirebiliyoruz.

Örnek


Örneğin producer mesajı gönderdi mesajın routingKey’i Error.Warning.Critial olarak belirlendiğini düşünelim ve consumer tarafında routingKey’imizi özelleştirerek mesajı okumaya çalışalım

routingKey:“Error.*.Critial” Error ile başlasın.Farketmez.Critial ile bitenleri oku.
routingKey: “#” Tümünü oku.
routingKey: “#.Warning” Sonu Warning ile bitenleri oku.

Şimdi gelin kodlar üzerinde konuşarak konuyu daha iyi kavramaya çalışalım. Önceki makalede olduğu gibi log uygulamamız üzerinden ilerleyeceğiz.

Producer

Kodlarımızı inceleyecek olursak ConnectionFactory sınıfından bir nesne yaratılır. Yaratılan bu sınıf üzerinden HostName set edilir. ConnectionFactory sınıfı bizim RabbitMQ hostuna bağlanmamıza sağlayacak olan sınıftır. Daha sonra CreateConnection()methodu ile bağlantı gerçekleştirilir.

CreateModel() methodu ile yeni bir channel oluşturulur.Channel üzerinden ExchangeDeclare() methodu ile yeni bir exchange oluşturulur. Son olarak ilgili channel kullanılarak BasicPublish() methodu çağırılır ve oluşturulan routingkey parametre olarak geçilerek mesaj exchang’e gönderilir.

Consumer

QueueDeclare() methodu ile yeni bir Queue oluşturulur. Oluşturulan Queue QueueBind() methodu kullanılarak ilgili exchange bind edilir. Bind işlemi sırasında geçilen routingKey parametresi ile dinlenecek olan kuyrukları belirtmektedir.Tüm kuyrukları dinleyebilmek için routingKey’i “#” olarak belirliyoruz. EventingBasicConsumer sınıfından bir nesne yaratılır. Oluşturulan channel parametre olarak geçilir. Üretilen nesne üzerinden Received event’i tetiklenir ve kuyruk dinlemeye alınır. Son olarak BasicConsume methodu ile ilgili kuyruktan mesaj alınır ve işlenir.

Test 1

RabbitMQ topic exchange sonu warnin olan kuyrukları dinlemek

İlk görselde sonu Warning ile biten routingKey’e sahip kuyrukları dinlemeye aldık. Consumer tarafından routingKey’i “#.Warning” olarak belirledik.

Test 2



İkinci testimizde ise tüm kuyrukları dinleyeme aldık. Tüm kuyrukları dinleyebilmek için routingKey’i “#” şeklinde belirledik.

Test 3


RabbitMQ error ile başlayan ve warning ile  biten kuyrukların dinlenmesi

Son olarak ise error ile başlayıp warning ile biten routingKey’e sahip kuyrukları dinlemeye aldık. Dinlemeye alırken routingKey’i “Error.*.Critial” şeklinde belirledik. Burada “*” karakteri ile o kısıma gelecek olan key değerinin ne olacağının farketmeyeceğini belirttik.

Bu makalede RabbitMQ içerisinde bulunan exchange türlerinden biri olanTopic Exchange türünü ele aldık. Umarım faydalı bir yazı olmuştur. Benim bu makalede anlatacaklarım bu kadar. Bir sonraki makalede Header exchange konusu ile devam ediyor olacağız. Hoşçakalın 🙂

Source


https://www.rabbitmq.com/documentation.html
https://github.com/eaktassssss/RabbitMQExchange

BUNLAR DA HOŞUNUZA GİDEBİLİR...

Bir cevap yazın

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