RabbitMQ nedir?

RabbitMq mesaj dağıtıcısı veya sıra yöneticisi olarak da bilinen bir mesaj kuyruğu yazılımıdır. Basitçe söylersek RabbitMQ ile sıralar tanımlar, bu sıralara mesaj gönderir ve istediğinizde de “RabbitMQ şu sıramda yeni mesaj var mı söyle bakalım?” dersiniz.

Bir başka deyişe, Rabbit MQ yazılımlarınızın mesajlaşması için ortak bir platform, mesajlarınız alınana kadar bekleyecekleri posta kutuları sağlar.

Yazılımlar arası mesaj ne demek?

Mesaj, bir alıcıdan bir vericiye gönderilmesi gereken herhangi bir bilgi olabilir. Çalıştırılması gereken herhangi bir işle ilgili bilgi ve parametreler, gönderilecek bir maille ilgili bilgiler, veya ihtiyacınıza göre basit bir metin mesajı olabilir. Örneklersek daha anlaşılır olacaktır.

RabbitMQ kullanım örnekleri

RabbitMQ veya mesaj kuyrukları genel olarak tamamlanması vakit alan işlemleri kullanıcıyı bekletmeden arka planda yapmak için kullanılıyor. Böylece farklı işlemler için farklı altyapılar, programlama dilleri, sunucular vb. kullanmak da mümkün oluyor, büyük sistemlerde kapasiteyi daha etkin kullanmak ve daha kolay artırmak mümkün oluyor.

Eğer mesaj kuyruğu kavramını ilk defa duyuyorsanız ne olduğunu anlamanın en kolay yolu örnekler üzerinden gitmektir. Bunu için aşağıda bazı senaryolar ile anlatmaya çalışacağım. (Mümkün olduğunca basitleştirerek, olayın mantığı anlatmaya çalıştığım için gerçek hayat kullanımlarını birebir yansıtmayabilir.)

Senaryo 1: E-posta gönderimi

Kullanıcının yaptığı işleme göre, kullanıcının kendisine veya etkilenen diğer kişilere e-posta göndereceğimizi düşünelim. E-posta gönderimini gerçek zamanlı olarak yaparsak kullanıcının işlem tamamlanana kadar beklemesi gerekecektir. Basit bir kullanıcı kaydı işleminden sonra, sunucu tarafında maili gönderip tarayıcıya yanıt gönderene kadar kullanıcıyı 3-4 saniye bekletmeniz gerekir. Peki ya kullanıcının yaptığı bir işlemi onu takip eden 1000 kişiye ayrı ayrı mail atmanız gerekiyorsa, kullanıcıyı saatlerce bekletecek misiniz?

Bu sorunu aşmak için gönderilmesi gereken mailleri bir veri tabanına yazar, düzenli olarak çalıştırdığınız başka bir script ile veri tabanını düzenli olarak sorgular, işlemleri gerçekleştirdikçe ilgili satırları veri tabanından silersiniz. (Kendim böyle bir mantık kurup php ve mysql ile kodladığımda hem çok zevk almış, hem de “çok güzel oldu beee” diyip kendimle gurur duymuştum. )

Buna benzer veya belki biraz daha gelişmiş bir mantığı kendiniz kurup kodladığınızı varsayalım. Yine de veri tabanınızı gereksiz yoracak, performans sorunları yaşayacak ve gerçek zamanlı olarak işlem yapamayacaksınız.

Bunun yerine RabitMQ ile “eposta” kuyruğuna “parametreleri” göndermeniz, mail gönderen asıl scriptinize de “RabbitMQ’ya bağlan, eposta kuyruğuna yeni mesaj geldiğinde sana haber versin, mesaj gelince de içindeki parametreleri al maili gönder” demeniz yeterlidir. RabbitMQ bunu hem yüksek performansla yapar, hem de hata giderme dahil bir çok senaryo için çözümleri içinde hazır olarak barındırır.

Senaryo 2: Video dosyası işleme, belirli bir fomata dönüştürüp, farklı kalitelerde kaydetme

Bir diğer örnek ise youtube veya Facebook’a bir video gönderdiğimizde “videonuz arka planda işleniyor, tamamlandığında bilgilendirileceksiniz” benzeri bir mesaj aldığımızda karşımıza çıkıyor.

Gönderdiğimiz videonun farklı format ve kalitelere çevrilmesi oldukça zaman alan bir işlem olduğu gerçek zamanlı yapılması halinde uzun süre beklememiz gerekir. Zaten bu işlem o an dosyayı gönderdiğimiz sunucu tarafından değil, bambaşka bir altyapı, donanım ve kod ile yapılmaktadır.

Biz videoyu gönderdikten sonra “şu kullanıcının gönderdiği şu videonu ham dosyasını işle” mesajı kuyruğa gönderilir ve asıl dönüştürme işini yapan proses bu mesajı aldığında dönüştürme işlemini yapar. Bu hem işlemin arka planda yapılmasını,, hem de aynı anda 100 istek geldiğinde bunların sırayla yapılmasına olanak sağlar.

Eğer işleri hızlandırmak istersek bu kuyruğa birden fazla video işleme prosesi bağlayarak işlerin daha hızlı yürümesini sağlayabiliriz. RabbitMQ gelen mesajları bu proseslere belirlediğimiz kurallar dahilinde dağıtır, eğer bir sorun çıkar ve “tamam video işlemeyi tamamladım” yanıtını alamazsa o işi otomatik olarak tekrar kuyruğa alır.

Senaryo 3: Bildirim Gönderme

Yukarıdaki örneğimizin devamında, video işleme tamamlandığında videomuzun tamamlandığına dair bir bildirim alıyoruz, hatta takipçilerimize de video gönderdiğimize dair bildirim gidiyor. Video dönüştürme işlemi için güçlü grafik kartları koyduğumuz donanımımızı bildirim göndermek için neden meşgul edelim? İlgili kuyruklara mesaj gönderelim ve bırakalım o kuyrukları takip eden, bu iş için çalışan yazılımlarımız bunu yapsın.

RabbitMQ’yu hangi programlama dilleri ile kullanabilirim?

RabbitMQ .NET, PHP, Python, Ruby on Rails, Java, Node.js üzerinde javascript vb. bir çok programlama dili ile kullanılabiliyor. Bu büyük projelerde farklı mimarilerin kullanılabilmesine de olanak sağlıyor. Örneğin PHP ile web sayfasını servis ederken, projenin makine öğrenmesi gerektiren bölümlerini python’a yaptırıp bu ikisi arasındaki iletişimi kolayca sağlayabiliyorsunuz?

Bu yazıda kod ya da kuruluma girmeden, RabbitMQ nedir kısaca anlatmaya çalıştım ve buna rağmen epey uzun oldu. Bu nedenle “Docker üzerinde RabbitMQ” kurulumu yapıp PHP ve Pyhton kod örneklerini paylaşacağım ayrı bir yazı planlıyorum. Açıklık getirmemi istediğiniz bir konu varsa aşağıdaki yorum kutucuğuna yazarak sorabilirsiniz.