RabbitMQ Nedir?
Herkese merhaba arkadaşlar, bugün ki yazımda bir mesaj kuyruk sistemi olan RabbitMQ’dan bahsedeceğim. RabbitMQ’yu ilk defa bir arkadaşımdan duydum ve öğrendiğim kadarıyla size bilgi vermeye çalışacağım .
Hazırsak hadi başlayalım…
RabbitMQ Nedir?
RabbitMQ bir kaynaktan gelen mesajı sırası geldiğinde başka bir kaynağa gönderen, open source ve platform bağımsız çalışabilen, alanında çok kullanılan mesaj kuyruk teknolojilerinden biridir.
Bu kaynaktan gelen mesaj, bir alıcıdan bir vericiye gönderilmesi gereken herhangi bir bilgi olabilir. Çalıştırılması gereken bir işle ilgili bilgi, gönderilmesi gereken bir maille ilgili bilgi veya ihtiyacımıza göre basit bir metin mesajı olabilir.
Mesaj kuyruk yapılarını alternatif olarak Apache, Kafka, Azure Storage Queue, Kestrel, ActiveMQ olarak örneklendirebiliriz.
RabbitMQ Kullanım Örnekleri
RabbitMQ tamamlanması vakit alan işlemleri kullanıcıyı bekletmeden arka planda yapmak için kullanılır. RabbitMQ farklı işlemler için farklı altyapılar, programlama dilleri, sunucular vb. kullanmayı mümkün hale getirir.
Bunu birkaç senaryo üzerinden anlatacak olursam,
*PHP ile web sayfasını servis ederken, projenin makine öğrenmesi kullanılması gereken kısmını Python’a yaptırıp bu ikisi arasındaki iletişimi kolayca sağlayabilirsiniz.
RabbitMQ, response zamanı uzun sürebilecek operasyonları uygulamadan bağımsızlaştırarak buradaki sorumluluğu farklı bir uygulamanın üstlenmesini sağlayacak olan bir mekanizma sunmaktadır. Bu mekanizma; uzun sürecek/maliyetli işlemleri RabbitMQ aracılığıyla kuyruğa gönderecektir ve bu kuyruktaki işlemler farklı bir uygulama tarafından işlenerek sonuç asenkron bir şekilde ana uygulamadan bağımsız elde edilecek, böylece ana uygulamada ki yoğunluk mümkün mertebe minimize edilmiş olacaktır.
*Burs başvurusu alan bir uygulamamız olsun ve bursu kazanan öğrencilere mail ile bilgilendirme göndereceğiz. Bursu kazanan 500 öğrencimiz olsun ve bu öğrencilere toplu mail gönderme ile bilgilendireceğiz.
Bu işlem yapılırken önce veri tabanından bursu kazanan öğrenciler bulunup mail adresleri tespit edilir. Daha sonra bir döngü ile dönüp mail göndermek için oluşturduğumuz metot çalıştırılır.
Bu işlem 500 öğrenciye mail gidene kadar devam eder, oldukça uzun ve maliyetli bir işlemdir. Mailin gönderileceği öğrenci sayısı artıkça işlemin maliyeti ve süresi uzayacaktır.
Peki bu sorunu nasıl çözebiliriz?
Sistemde ki çalışmamızı hiç etkilemeden bu işlemlerin bir kuyruğa gönderilmesi ve bu kuyruğu dinleyen başka bir uygulamanın bu işi gerçekleştirmesi süreyi ve maliyeti azaltmamıza yardımcı olur.
*Bankaların kullandığı EFT, havale vb. işlemleri düşünün. Bunun gibi yoğun istek(request) gerektiren işlemlerde sıraya alınan işlemlerin asenkron şekilde yapılması, hem çalışan uygulamanın boş yere bekletilmemesi hem de sunucu üzerindeki işlem maliyetini minimuma indirilmesi için RabbitMQ tercih ediliyor.
Hadi şimdide RabbitMQ çalışma prensibine bakalım.
RabbitMQ Çalışma Mantığı
Sunucu RabbitMQ sunucusuna bir mesaj gönderir ve sunucu bu mesajı exchange üzerinden ilgili queueya yönlendirir. Publisher(producer) mesajı gönderirken ilgili queueyı bilmemektedir. Mesaj, exchange üzerinden routing key’e göre “queue” ya iletilmektedir. Sonrasında başka bir uygulama bu queueyi dinler ve FIFO mantığıyla çalışan kuyruktaki bu mesajları consume ederek mesajı process eder ve süreci sonlandırır. Bu gönderilen mesaj text olmak zorunda değil, her türlü objecti gönderebiliriz.
Bazı kavramlardan bahsedelim:
Get BetulKayam’s stories in your inbox
Join Medium for free to get updates from this writer.
1.Producer(publisher): Kuyruğa mesaj gönderen veya oluşturan taraftır.
2.Consumer: Subscribe(abone) olduğu kuyruğa mesaj geldi mi diye dinleyen ve gelen mesajı alıp process edip tüketen taraftır.
3.Queue: Mesajların RabbitMQ tarafından eklendiği kuyruktur.
4.Routing Key : Buraya girdiğimiz keye göre mesajı ilgili queueye yönlendirir.
5.Exchange: Producer’dan gelen mesajları kuyruğa iletmek üzere kabul eder. Exchange, aldığı mesajla ne yapacağını bilmelidir. Routing key yardımı ile mesajı ilgili kuyruğa iletmektedir.
6.Exchance Type: Mesajın hangi “queue” ye ne şekilde iletileceğini belirtir. 4 tane exchange tipi bulunmaktadır Direct, Topic, Fanout,Header.
- Direct Exchange: Mesajı gönderdiğiniz keye göre dağıtıyor bu yüzden mesaj sadece bir kuyruğa gidiyor.
- Fanout Exchange: Gelen mesajı bağlı olan tüm kuyruklara dağıtıyor.
- Topic Exchange: Bu mesajların nasıl dağıtılacağına ayarlarınıza göre karar veriliyor.
- Header Exchange: Kontrol etmek istediğiniz bilgileri mesajınızın headerında tanımlayabiliyorsunuz.
7.Binding: Exchance ve queue arasındaki bağlantıdır.
Bu çalışma mantığını size bir senaryo üzerinden anlatırsam kafanızda daha iyi oturtursunuz diye düşünüyorum.
Process olarak mektup(nesne) postaneye verilir, postane (kendi iş akışları doğrultusunda) işleme alır ve göndericiye ulaştırır, posta ulaşana kadar siz kendi işlerinizi yapmaya devam edersiniz mektubun gönderilmesini beklemeyiz.
RabbitMQ’nun bizlere sağladığı kolaylıkları ve çalışma mantığını elimden geldiğince sizlere anlattım. Bir sonraki yazımda size RabbitMQ’nun kurulumunu anlatıp bir proje üzerinden örneklendireceğim.
Sizlere bugün mesaj kuyruk sistemi olan RabbitMQ anlatmaya çalıştım. Umarım faydalı bir yazı olmuştur.
İyi çalışmalar…







