RabbitMQ, AMQP(Advanced Message Queuing Protocol) üzerine kurulmuş bir mesaj kuyruğu sunucusudur. Birçok yazılım dili ve işletim sistemi tarafından desteklenmektedir. Open source’dur. Kolaylıkla ölçeklenebilir, yüksek performanslı ve esnek bir sistemdir. Asenkron olarak yapılacak işlemleri bir kuyruğa koyarak sırası geldiğinde gerçekleşmesini istediğimiz durumlarda ve sistemler arasında güvenilir bir şekilde veri aktarımı amacıyla kullanılabilir.
Örnek vermek gerekirse bir işlem sonucunda mail veya bildirim atılmasını istediğimizde kuyruğa yazarız kullanıcı işlemi bitmiş olduğunu görür. Consumer kuyruktan okuyarak sonrasında mail veya bildirim gönderme işlevini yerine getirir. Bildirim gönderilmesi için kullanıcıyı bekletmemiş oluruz.

Nerelerde kullanılabilir ?
Mikroservislerde ve Dağıtık Sistemlerde iletişim
RabbitMQ, farklı programlama dilleri ve platformlar arasında iletişim kurulmasını mümkün kılar. Aynı zamanda Microservis içerisindeki uygulamalar arasında iletişimde de kullanılmaktadır. Uygulamaların birbirine bağımlı olmadan mesaj alıp göndermesini sağlar.(Loose Coupling) Veri tutarlılığını sağlar. Bileşenlerin birbirleriyle senkronize olmasını ve veri kaybı olmadan veri aktarımını sağlamaktadır.
Asenkron yürütülen işlerde
Arka planda uzun süren ve işleyişi etkilemeyen işlemleri belli bir sıra ile paralel olarak gerçekleşmesini istediğimiz durumlarda kullanılabilir. Response süreleri kısaltır ve performansı arttırır.
Veri İzlemek
İzlenecek verileri kuyrukta depolayıp sonrasında okuyarak anlamlı veriler çıkarmak için kullanılabilir.
Özellikleri
Yüksek Performans ve Ölçeklenebilirlik
RabbitMQ, yatay ve dikey olarak ölçeklenebilir. Yüksek trafikli sistemler için uygundur. Ölçekleme işlemini kolaylaştırmak için kümelenme (clustering) ve yük dengeleme (load balancing) gibi özellikler sunar. Kuyrukların yoğunluğuna göre dağılımını yaparak yük dengelemeyi sağlar.
Federasyon (federation), Farklı RabbitMQ cluster veya sunucuları arasında iletişimi kolaylaştıran bir yapı sunar.
Güvenilirlik ve Dayanıklılık
RabbitMQ güvenilir ve dayanıklı bir mesaj kuyruğu sunucusudur. Verilerin kaybolmaması ve bozulmaması için farklı yapılar sağlamaktadır. Bunlardan bazıları;
Persistence, Mesajların diskte veya bellekte saklanmasını sağlar.
Message Acknowledgement, Mesajların başarılı bir şekilde iletilip işlendiğinin doğrulamasını sağlar.
Ayna kuyruklar (mirrored queues), Bir kuyruğun birden fazla düğümde kopyasını bulundurmasıdır. Bununla birlikte bir kuyrukta problem olması durumunda diğeri devreye girmektedir.
Esneklik ve Uyarlama
RabbitMQ, farklı senaryolara uyum sağlamak için çeşitli değişim tipleri (exchange types) sunar. Değişim tipleri kurallara göre kuyruklara yönlendirme yapar. Bu konuyu daha ayrıntılı olarak inceleyeceğiz. RabbitMQ eklenti(plugin) desteği sunar. Bu sayede çeşitli özellikler kazandırılabilir.
Kolay Kurulum ve Kullanımı
RabbitMQ, birçok işletim sisteminde ve programlama dili ile çalışabilir ve oldukça kolay bir kuruluma sahiptir. Kullanıcı dostu bir arayüzü bulunmaktadır. Bu arayüzden izleme, yönetme gibi işleri yapabiliriz.
RabbitMQ Temel Bileşenler
Publisher, RabbitMQ’ya verinin gönderildiği yer. Veriyi üreten uygulama veya bileşendir.
Consumer, RabbitMQ’ya gelen verilerin işlendiği bileşendir.
Queue, Verilerin tutulduğu kuyruklardır.
Routing Key, Verilerin hangi kuyruğa iletileceğini tanımladığımız anahtardır.
Exchange, Verilerin kuyruklara route key’e göre iletilmesini sağlar. 3 çeşit Exchange tipi vardır.

Exchange Tipleri
Direct Exchange
Routing key değeri ile direk eşleşen kuyruğa mesajları yönlendirir. Producer tarafından net olarak belirtilir. İki routing key bir queue’ye bağlanabilir.

Fanout Exchange
Mesajları tüm kuyruklara route belirtmeksizin yönlendirir.

Topic Exchange
Mesajları routing key değeri içerisindeki özel karakterlere göre farklı farklı kuyruklara yönlendirme yapar. “#” veya “.” gibi özel karakterlerle bir gruba yada tüm gruba ulaşılabilir.

Yukarıdaki örneğe göre routing key değeri;
“weather.turkey.istanbul” – C ve B kuyruğuna
“weather.italy.rome” – B kuyruğuna
“turkey.news.sport” – A kuyruğuna
“italy.news.sport” – A kuyruğuna
Headers Exchange
Mesajların header içerisinde key-value değerine göre yönlendirme yapar.Bir uygulamada sadece kadınlara özel bir bildirim atılması istendiği durumda headers exchange aracılığıyla ilgili kuyruklara gönderir.
Default Exchange
Bir tanımın yapılmadığı durumdur. Queue adıyla aynı isimde routing key ile bağlanır.
Dead Letter Exchange
Bir kuyruk ile eşleşme olmadığı durumda mesaj kaybolabilir. Böyle bir durum için bu exchange tipi eklenti olarak kullanılabilir. Ortada kalan mesajları nasıl işleneceğine karar verebiliriz. İşlenemeyen mesajları da kaybolmasını önleriz.
KAYNAKÇA
https://www.rabbitmq.com/tutorials
https://bluemarkacademy.com/rabbitmq-nedir-avantajlari-ve-uygulamalari-nelerdir
https://medium.com/trendyol-tech/rabbitmq-exchange-types-d7e1f51ec825