Exchange-Fanout

610

Evvelki iki makalemiz (Merhaba RabbitMQ, WorkQueue) genelde mesaj queueya özelde ise rabbitmq’ya giriş mahiyetinde idi. Bu ve takip eden makalelerimiz ile birlikte rabbitmq’nun temeli olan exchange konusunu anlamaya çalışacağız.

RabbitMQ’nun mesaj gönderme modelinin temel mantığı; producer’ın mesajı göndereceği queue’yu bilmemesi ve mesajı direk queue’ya göndermemesidir. Exchange’de bu mantığın temelidir. Exchange producerdan mesajı alır ve mesajı queue veya gueuelara gönderir. Exchange aldığı mesajı ne yapacağını ise aşağıdaki bilgilere göre belirler.

1* Exchange tipi
2* Routing_Key(Mesaj ile bildirilir)
3* Binding_Key(Consumer tarafından bildilir)

RabbitMQ mimarisi aşağıdaki gibidir.

Exchange de queue gibi kalıcı(durable) yapılabilir. RabbitMQ restart edilse bile mesajların kaybolması engellenir.

rabbitmqctl list-exchanges komutu ile var olan exchangeler listelenir. Biz bu komutu çalıştıralım. Sonuç aşağıdaki gibi olucaktır.

Sonuçtaki ilk kısım exchange isimlerini gösterir. Sonuçlar içinde bir tane isimsiz exchange mevcut. Biz önceki iki makalemizde bu isimsiz exchange’i kullandık aslında.

ilk parametre exchange ismini alır. Biz bu değeri boş string olarak göndermiştik. İkinci kısım ise exchange tiplerini gösterir. RabbitMQ’da dört adet exchange tipi vardır.
*fanout
*direct
*topic
*headers

Biz bu makalemizde fanout exchange tipine yoğunlaşacağız. Fanout’a geçmeden önce iki önemli başlıktan bahsedelim. Sonrasında ise fanout özelinde alışık olduğumuz kodlama işine girişelim.

Binding:
Exhange ile Queue arasında kurulan ilişkiye binding denir. Exchange gelen mesajları hangi queue’ya koyacağını binding’e göre karar verir.

rabbitmqctl list-bindings ile listelemesini yaparız.

Geçici Kuyruklar(Temporary Queues):
Queue tanımlama işini rabbitmq ya bıraktığımız durumdur. RabbitMQ’ya her bağlandığımızda yeni bir queue oluşmasını ve bağlantıyı kapattığımızda otomatik silinmesini istiyorsak, geçici kuruk oluştururuz.

Fanout:
Bu exchange tipinde, exchange aldığı tüm mesajları, kendisine bağlı olan tüm queue’lara gönderir.
Mesaj gönderirken routing_key değeri vermemize gerek yoktur. Vermiş olsak bile, bu deger dikkate alınmaz. Producer ve Consumer uygulamalarımızı geliştirelim.

Producer:
1* Eclipse ile bir java projesi oluşturalım.
2* Projemizi maven uyumlu hale getirelim.
3* pom.xml dosyamız aşağıdaki gibi olacak.

4* SenderStarter.java sınıfını geliştirelim.

SenderStarter.java

Kodu ile exhange tanımı yaptık. İsmini ve exchange tipini belirttik.

Producer:
1* Eclipse ile bir java projesi oluşturalım.
2* Projemizi maven uyumlu hale getirelim.
3* pom.xml dosyamız aşağıdaki gibi olacak.

4* ReceiverStarter.java sınıfını geliştirelim.

ReceiverStarter.java

Producer ve consumer’in aynı exchange’i kullanması lazım.

channel.queueDeclare() metodu ile geçici bir queue oluşturduk. Queue ismini rabbit verecek. Bu sebeple getQueue() ile queue ismini alıyoruz.

Oluşan queue ile exchange arasında binding oluşturuyoruz. Üçüncü parametreyi boş gönderdik. Bunu diğer exhange tiplerini anlatırken kullanacağız.

Geçmiş makalelerimizde olduğu gibi jar dosyalarını oluşturup uygulamalarımızı çalıştıracağız. İlk önce Consumer uygulamasını çalıştıracağız. Eğer ilk olarak Producer çalıştırılır ise, queue henüz olmadığından exhange e gönderilen mesajlar kaybolur.

İlk önce iki ayrı terminalde Consumer çalıştıralım. Ardından aşağıdaki komutlar ile queue, binding ve exchange’leri listeleyelim.

Yaratılan geçici queue’ları ve exchange ile bu queue’lar arası binding’leri gördük.

Şimdi Producer’i çalıştıralım. Uygulama çıktıları aşağıdaki gibi olacaktır.

Fanout exchange tipi ile ilgili makalemiz bu kadar. İnşallah faydalı olmuştur.

İyi Çalışmalar

ÖrnekProje

Yorum yaz

Email adresiniz yayınlanmayacaktır.