Merhabalar herkese,

Daha önce birkaç ileri seviye programlama konusu açmıştım. Bu durumu müsait oldukça yapmak istiyorum. Bugün farklı ve sistemlere göre gerekli olan RabbitMQ teknolojisini anlatacağım. Konu bazıları için gerekli, bazıları için gereksiz gelebilir. Gelişime ve ileriye yönelmeye önem gösteren kişiler için faydalı olacağını düşünüyorum. O zaman RabbitMQ nedir anlatayım:

RabbitMQ, bir database sistemine de benziyor, bir haberleşme sistemine de benziyor. İkisinin arasında kalan, güçlü bir teknoloji. RabbitMQ, iletici(publisher) ve alıcı(consumer) arasındaki köprüleme işlemini sağlar. Bu ne demektir ? Bunu biraz daha açalım.



Biraz daha açmadan önce Publisher ve Consumer terimlerinden bahsedeyim. Publisher işlemi gerçekleştiren ve sıraya sokma emri veren kısım. Consumer ise bu işlemi gerçekleştiren kısım. Şöyle anlatayım: bir kullanıcı üye oldu ve back-end'e veriyi gönderdi. Buradaki fonksiyon DB kaydını açtı ve mail gönderimi talebinde bulundu. Bunu RabbitMQ'a bildirdiği için Publisher oluyor. Diğer tarafta da bu talepleri alacak ve mailleri gönderecek kısım var. Bu da Consumer diye geçiyor. İki tarafta mikro servis aslında.

Saniyelik işlem sayısı çok fazla olan projelerde kullanımı oldukça fazla olan RabbitMQ, verilerin doğru bir şekilde işlenmesini ve veri kaybını önler. Bizim bir projemiz olsun. Bu projede saniyede 1.000 işlem gerçekleştirsin. Her işlemde ortalama 7-8 saniye sürüyor ve kullanıcı beklemek zorunda(Arkaplanda mail gönderimi yapıyor örneğin). İşlem sayısı arttıkça doğal olarak birikim artacak ve 7-8 saniye süren execute zamanları, daha fazla hale(20sn+) gelecek. Bu süre uzadıkça, bu seferde server tarafında işlem kuyruğu oldukça fazla artacak. Server bunları işlemeye çalıştıkça, server tarafında ısınmalar, performans problemleri ve crash sorunları yaşanacak.



Uygulama çöktüğünde ise bu bekleme kuyruğundaki verilerimizde yok olacak. Çünkü bunu bir yerde tutmuyoruz. Ancak "bizim için bu verileri kaydeden ve yoğunluklara göre istemcilere gönderen bir sistem olsa nasıl olurdu ?" sorusuna cevabı RabbitMQ veriyor. RabbitMQ alınan bu işlemleri bir sıraya sokuyor. Daha sonra istemcilere(consumer) otomatik olarak gönderiyor. Sırayla ve paylaştırarak gönderdiği için işlemleri, bu yükteki performans kaybı ortadan kalkıyor. Bir nevi "load balancing" diyebiliriz.

RabbitMQ publisher'dan aldığı istekleri, consumerlara aktarıyor. Publisher sayısı 1 veya daha fazla olabilir. Aynı şekilde consumer sayısı da 1 veya daha fazla olabilir. RabbitMQ istekleri kendi veritabanında biriktiriyor. O an kaç adet bu işlemi gerçekleştirmek için hazır olan consumer varsa, onlara sırayla gönderiyor. O consumerlarda bu verileri işleyip, Acknowledge(veya nack) bildiriminde bulunuyor. O an örnek veriyorum 3 adet consumer var. RabbitMQ paylaştırdı paylaştırdı veriyi biraz eritti. Daha sonra bir consumer kapandı. Bu sefer kalan 2 consumer ile devam ediyor işlemlerine. Veya sisteme 1 adet daha consumer eklendi. Bu seferde eklenen consumer'a da paylaşım gerçekleştiriyor. Peki o anda tüm consumerlar çekildiğinde ne olacak ? İşte bu seferde verileri içerisinde bekletip, consumer bağlantısı gerçekleştiği anda onlara dağıtımlarını sağlamaktadır.

"Kendi veritabanıma yazar, oradan çekerim. Ne farkı var ki ?" diye bir soru oluştuysa kafanızda, şöyle cevaplayayım: Verileri kendi veritabanınızdan çekip, döngülerle uğraşmanız sizi epey uğraştıracaktır. Ek olarak birden fazla aynı işlemi gerçekleştiren cluster açtığınızda, veri karmaşası ortaya çıkacaktır. Örneğin iki cluster aynı anda veriyi alıp, aynı anda işleyebilir.

Özetlemek gerekirse: kuyruklu işlemleri gerçekleştiren, bunları doğru bir şekilde bölüştüren ve veri kaybını engelleyip, işlemlerin sağlanmasını sağlayan mekanizmadır RabbitMQ. Büyük çaplı projelerinizde, uygun görüldüğünde kullanılması gerekir. Kullanımı oldukça basit. Sizde ihtiyacınıza göre RabbitMQ'u kullanabilirsiniz.

Aşağıdan diğer yazılarıma ulaşıp, bilgi edinebilirsiniz. Farklı paylaşımlarda görüşmek üzere

🚛 Docker nedir ? Ne için kullanılır ? İleri seviye programlama 💻
🚀 SPA Nedir ? Web Geliştiriciler İçin Önemli Konu - Modern Web Geliştirme
🔎 React VS. Angular - Modern Geliştirme Araçlarını Karşılaştırdık 🚨