Merhaba arkadaşlar.
Bu makale konumda sizlere son zamanlarda üzerinde çalışmış olduğum, server to server bir mesaj kuyruğu sistemi olan RabbitMQ hakkında edindiğim deneyimlerimi aktarmaya çalışacağım. 🙂
RabbitMQ Nedir?
RabbitMQ en öz tabiri ile mesaj kuyruğu sistemidir. Publish ve Subscribe mantığı altında çalışmaktadır. Yani bir uygulamadan bir mesajı alıp, bir başka uygulamaya sırası geldiğinde bunu iletmektir. Gerçek hayat içerisinden bir örnek vermek gerekirse; tıpkı bir kargo firmasının ilgili kargoyu göndericiden alıp, belli bir sıra ile bunu ilgili alıcıya iletmesi gibidir diyebiliriz. RabbitMQ bir çok yazılım diline destek verdiği gibi, bir çok işletim sistemi üzerinde de çalışabilmektedir ve open source‘dur.
Yavaş yavaş RabbitMQ’ya giriş yapmaya başladığımıza göre, öncelikle literatürümüzde olması gereken bir kaç kelime bulunmaktadır:
- Publisher: Kuyruğa mesaj gönderen uygulamadır.
- Consumer: Kuyruktaki mesajı dinleyecek olan uygulamadır.
- Queue: Mesajların RabbitMQ tarafından eklendiği kuyruktur.
- Exchange: Bir kaç Exchange tipi bulunmaktadır. Yaptığı işlem ise ilgili Routing Key‘e göre mesajı ilgili Queue‘ya yönlendirmektir.
- Exchange Type: İlgili mesaj’ın Routing Key’e göre hangi Queue‘ya nasıl yönlendireceğini belirlemektedir.
Neden Kullanmalıyız?
Şuana kadar bahsettiğimiz kadarı ile belki ne gerek var mesaj kuyruğu yönetimi için 3rd party bir uygulamaya diyebilirsiniz. Veya neden bir mesaj kuyruğu işlemlerine gereksinim duymalıyım da diyebilirsiniz. Cevap basit: her şey ölçeklenebilir(scalability) bir ortam oluşturmak için. Anlık yapılmayan işlemleri asenkron bir şekilde gerçekleştirerek, hem uygulamamızı kullanan kişileri gereksiz bir response time maliyetinden arındırmış oluruz hemde server üzerindeki concurrent process maliyetini bir nebze ölçeklenebilir bir hale getirmiş oluruz.
Kendi mesaj kuyruğu yapımızı belki bir çoğumuz SQL üzerinde gerçekleştirmişizdir. Benimde zamanında gerçekleştirmiş olduğum en yaygın olan örneği ise: Uygulamalarımızda e-posta gönderme işlemlerinin bir MailQueue tablosuna yazılmasıdır. Sonrasında ise bu MailQueue tablosunu consume edecek bir servis yazarak ilgili e-posta’ların sırasıyla, asenkron bir şekilde gönderilmesini sağlamışızdır. Bu gerçekleştirilen çözümde en temel çözümlerden birisidir.
Fakat bu çözümün bazı dezavantajları bulunmaktadır:
- Queue’ya eklenmesine karar verdiğimiz bir özellik, uygulamamızda sıklıkla kullanılan ve asenkron gönderiminde de problem bulunmayan bir özelliktir. Bu sebeple oluşturulan bu Queue’nun belli zaman aralıkları ile tüketilmesi gerektiği için RDBMS üzerinde yoğun bir transaction trafiğine sebep olacaktır.
- Ana konumuz ölçeklenebilirlik(scalability) olduğu için, RDBMS üzerinde hem Queue’ya bir öğe eklerken hemde Queue’yu tüketirken yoğun transaction’lara sebebiyet vereceğimizden dolayı ölçeklenebilirlik pek söz konusu değildir.
- Birde bunlara ek olarak maintenance ve performans sorunları ile uğraşmak gerekiyor.
İşi bu dezavantajları göz önüne aldığımız zaman, RabbitMQ bunların hepsini ölçeklenebilir ve performanslı bir şekilde bizler için kendi Queue mekanizmasında gerçekleştiriyor.
RabbitMQ içerisinde bulundurduğu Publish, Subscribe ve Routing mekanizması ile Gelişmiş Mesaj Kuyruğu Protokolü (AMQP) standardına uygun olarak çalışmaktadır. Red Hat Enterprise MRG, MSMQ, OpenAMQ gibi enterprise çözümler arasında ise RabbitMQ gerek performansı gerekse de ölçeklenebilirliği anlamında ön plana çıkmaktadır.
RabbitMQ erlang dili ile geliştirilmiş bir yapıdır.
Kurulumu
Bir çok işletim sistemini desteklediğinden bahsetmiştik. Ben test ortamlarım için windows üzerinden kurulumlarımı gerçekleştirdim. Kurulumlara başlamadan önce, öncelikle buradan erlang kaynağını yüklemeniz gerekmektedir. Ben şuanda en güncel sürümü olan “OTP 18.2.1 Windows 64-bit Binary File (101028381)” kaynağını kullanmaktayım.
Erlang dilinin kurulumundan sonra RabbitMQ kurulumuna geçebiliriz. Öncelikle buraya girerek “download” sekmesinden RabbitMQ server dosyasını indiriniz. En güncel sürümü olan “rabbitmq-server-3.6.0.exe” versiyonu bende kurulu bulunmaktadır.
RabbitMQ installer’ını çalıştırmadan önce dikkat etmeniz gereken bir kaç husus bulunmaktadır. (Şayet sizlerde benim gibi saatlerce kafayı yiyebilirsiniz.)
1. Bilgisayarınızın host name’i, RabbitMQ node name’i ile aynı olmalıdır.
Eğer sizlerde benim gibi bir windows üzerinde farklı kullanıcı oturumları kullanıyorsanız, bu problemi yaşayabilirsiniz. RabbitMQ node name’ini ayarlayabilmek için ise: Bilgisayarım’a sağ tıklayıp özellikler’e girdikten sonra, aşağıda gördüğünüz resim üzerindeki tab menüye gelerek, “Ortam Değişkenleri” kısmına tıklayınız.
Ortam Değişkenleri’ne tıkladıktan sonra açılacak olan pencerede aşağıda bulunan Yeni butonuna basarak yeni bir ortam değişkeni oluşturacağız. Bu ortam değişkeninin değişken adı: “RABBITMQ_NODENAME” girerken değişken değerini ise: “BİLGİSAYARINIZIN ADINI” girmeniz gerekmektedir.
2. Oturum açtığınız kullanıcı adı ASCII karakter içermemelidir
Bu kısımda büyük problemlerden birisi. Örneğin benim oturum açma adım “Gökhan” olduğu için RabbitMQ server’ını çalıştırmaya çalıştığım zaman “bad_utf8_character_code” hatasını aldım. Default olarak RabbitMQ “log” ve “db” dosyalarını “%USERPROFILE%\AppData\Roaming\RabbitMQ” path’i altında tutmaktadır. Bu path’i değiştirebilmek için 1. maddedeki girmiş olduğumuz Ortam Değişkenleri penceresinde, yeni bir ortam değişkeni eklememiz gerekmektedir. Değişken adı: “RABBITMQ_BASE” değerini ise: “C:\RabbitMQ” olacak şekilde (veya farklı bir path istiyorsanız) ayarlamanız yeterli olacaktır.
Gerekli önlem işlemlerini kontrol ettikten sonra şimdi indirmiş olduğumuz installer dosyasını çalıştırabilirsiniz. Bu işlem standart next->next işlemi gerçekleştirmektedir. Kurulum tamamlandıktan sonra, Başlat menüsünün uygulamalar sekmesinde RabbitMQ Server klasörü görebilirsiniz. Herşey bu kadar! 🙂 İlk kurulum default olan configuration ayarları ile gerçekleştirilmektedir.
Detaylı configuration ayarlarına buradan erişebilirsiniz. Bunlara ek olarak da sizlere, RabbitMQ Management Plugin’inini nasıl etkinleştirebileceğinizi göstermek istiyorum. Çünkü bu panel üzerinden Queue işlemlerini rahatlıkla takip edebileceksiniz.
Öncelikle RabbitMQ Server klasörü içerisindeki “RabbitMQ Command Prompt” u administrator yetkisi ile çalıştırın. Çalıştırdıktan sonra işlem yapabilmemiz için servislerin bulunduğu “C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.0\sbin” path’i altına gidelim.
sbin path’ine girdikten sonra şimdi Management Plugin’inini enable edebilmek için aşağıdaki komutları girelim:
rabbitmq-plugins enable rabbitmq_management
Yukarıdaki komutu girdikten sonra gördüğümüz üzere plugin’leri enable hale getirmiş bulunmaktadır.
NOT: Enable işlemi sırasında herhangi bir “Error: unable to connect to node ‘rabbit@somename’: nodedown” ile ilgili bir hata alırsanız eğer, komut satırında “rabbitmq-service stop” komutunu çalıştırıp sonrasında ise “rabbitmq-server restart” komutunu çalıştırınız.
Bu işlemlerin sonucunda Management ekranına girebilmek için localhost’unuz üzerinden default olarak gelen “15672” portu ile http://localhost:15672 adresinden erişebilirsiniz. İlk giriş sırasında kullanıcı ve şifre kısımları default olarak “guest” değeri gelmektedir. Aşağı şekildeki gibi bir ekrana sahiptir:
RabbitMQ makale serimin ilkine burada son vermek istiyorum. İlerleyen makalelerimde ise, c# provider’ı kullanarak nasıl Queue işlemleri gerçekleştirilebiliyor, RabbitMQ içerisindeki Routing işlemleri nasıl arkaplanda işliyor gibi konulara değineceğim.
Faydalı olması dileklerimle. 🙂
Allah razı olsun!Temiz ve anlaşılır!
eline sağlık hocam, çok işime yaradı gerçekten
Çok faydalı bir yazı olmuş elinize sağlık! tüm adımlar açık anlaşılır. sorunsuz çalıştı.
Teşekkür ederim yorumunuz için, sorun yaşamadığınıza sevindim. 🙂
Üstat Burada Daha Ne Olsun Herşey için Teşekkürler.
Teşekkürler.
Teşekkür ederim şu anda kurulumu tamamladım.
Rica ederim. 🙂
dahi anlamına gelen de’leri ayırırsan şükela olur.
Çok yararlı oldu, teşekkür ederim.
Tanrı sizden razı olsun. İşleriniz de başarılar. Şu olayı bu kadar temiz anlatan bir kaç makaleden biri sizsiniz. Teşekkürler.
yalın ve anlaşılır bir anlatım. emeğiniz için teşekkürler
Merhaba Gökhan Bey, consumer uygulaması olarak windows service kullanarak kuyruktaki verileri okuyup, .txt dosyasına yazdırmaya çalışıyorum.Verileri tam doğru bir şekilde .txt ye atmıyor, her defasında eksik atıyor. Senkronize problemi yaşıyorum.Yardımcı olabilir misiniz?
Merhaba, doğru bir şekilde txt’ye atmıyordan kastınız nedir acaba, biraz detay verebilir misiniz? RabbitMQ ile alakalı bir problem değil gibi görünüyor. Birden fazla consumer’ınız mı var? Yada multi-threaded olarak mı çalşıyorlar? Txt ye yazma işlemini nasıl yönetiyorsunuz?