RabbitMQ ve Exchange Türleri
--
Merhaba arkadaşlar,
Bildiğim kadarıyla sizlere RabbitMQ ve Exchange Türleri’ni anlatacağım.
RabbitMQ Nedir?
RabbitMQ asenkron yapılar için kullanılan bir mesaj kuyruğu sistemidir. Ne iş yapar sorusuna cevap olarak; producerdan yollanan mesajı consumera taşır. Bu yapı birbiriyle bağlantısı olmayan ve senkron olması zorunlu olmayan servisler arasında sıkça kullanılmaktadır. Özellikle mikroservis mimarisinde kullanılır. Örneğin; telefon veya kredi kartı faturalarınızdan yola çıkarsak, ödediğinize dair SMS’in size saatler veya günler sonra geldiğini farketmişsinizdir. Burada aslında ödeme alındığı anda size ait parametre içeren mesaj, fatura ödemesinde tetiklenen servis tarafından queueya bırakılır. Belirli saatlerde çalışılması zamanlanmış bir consumer, queuedan sırayla mesajları alarak datayı işler. Mesajlaşma sırası FIFO (First in First out) ilk giren ilk çıkar şeklinde yapılır.
Producer > Exchange > Queue > Consumer yani producer mesajı exchange’a, exchange ise türüne (Direct, Topic, Fanout) göre kendisine bağlı olan queue veya queuelara iletir. Queue ise son olarak consumer tarafından işlenir ve son olarak consumerda servisin yaptığı işler tamamlanır.
Mesajlaşma yapısı için;
Producer: Mesajı gönderen,
Exchange: Producer tarafından mesajı alıp, route bazında queueya ileten,
Queue: Exchange’dan mesajı alıp, mesajların durduğu tanım,
Consumer: Bağlı olduğu queuedan mesajı alıp, mesaja bağlı işlemi yapan.
Direct Exchange
Direct Exchange kendisine bağlı queue veya queuelara direkt olarak belirtilen route key ile ulaşır. Route key producer tarafından net olarak belirtilmelidir.
Topic Exchange
Topic Exchange kendisine bağlı queue veya queuelara belirli bir pattern veya Direct Exchange gibi queueya route key ile ulaşır. Route key pattern doğrultusunda producer tarafından belirtilmelidir. Topic Exchange için standartta geçerli route key pattern yapısı .# ve .* ile tanımlanır. Veya yukarda bahsettiğim gibi direkt olarak route key isimlendirmesi yapılabilir.
.* için .’dan sonra bir belirteç geleceği garanti edilir. .# için .’dan sonra herhangi bir şey gelebilir veya gelmeyebilir gibi düşünülebilir. Örnek kullanımları aşağıdaki gibidir;
.* : route.key.* için;
route.key.XYZ → ✓
route.key.ABC → ✓
route.key → ✗
route.key.ABC.XYZ → ✗.# : route.key.# için;
route.key.XYZ → ✓
route.key.ABC → ✓
route.key → ✓
route.key.ABC.XYZ → ✓
route.key.ABC.XYZ.QWE → ✓
NOT: Topic Exchange için herhangi bir route key pattern belirtilmediği sürece Fanout Exchange gibi çalışır. Exchange bağlı tüm queuelara mesaj taşınır. Aynı zamanda Topic Exchange pattern kullanılmadan net bir route key verilerek config edildiğinde Direct Exchange gibi çalışmaktadır.
Fanout Exchange
Fanout Exchange kendisine bağlı queue veya queuelara direkt olarak route belirtilmeksizin ulaşır. Producer tarafından Fanout tipindeki exchange’a yollanan tüm mesajlar bağlı tüm queue veya queuelara iletilir.
Bu yazımızda RabbitMQ ve Exchange Türlerini inceledik, bildiğim kadarıyla aktarmaya çalıştım. Umarım faydalı olmuştur.
Sizde kendinize göre senaryo çizip örnekler denemek isterseniz, tryrabbitmq.com adresinden simüle edebilirsiniz.