Categories: RabbitMQ

RabbitMQ Nedir ve Windows’a Kurulumu

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. 🙂

Gökhan Gökalp

View Comments

Recent Posts

Securing the Supply Chain of Containerized Applications to Reduce Security Risks (Policy Enforcement-Automated Governance with OPA Gatekeeper and Ratify) – Part 2

{:tr} Makalenin ilk bölümünde, Software Supply Chain güvenliğinin öneminden ve containerized uygulamaların güvenlik risklerini azaltabilmek…

6 months ago

Securing the Supply Chain of Containerized Applications to Reduce Security Risks (Security Scanning, SBOMs, Signing&Verifying Artifacts) – Part 1

{:tr}Bildiğimiz gibi modern yazılım geliştirme ortamında containerization'ın benimsenmesi, uygulamaların oluşturulma ve dağıtılma şekillerini oldukça değiştirdi.…

8 months ago

Delegating Identity & Access Management to Azure AD B2C and Integrating with .NET

{:tr}Bildiğimiz gibi bir ürün geliştirirken olabildiğince farklı cloud çözümlerinden faydalanmak, harcanacak zaman ve karmaşıklığın yanı…

1 year ago

How to Order Events in Microservices by Using Azure Service Bus (FIFO Consumers)

{:tr}Bazen bazı senaryolar vardır karmaşıklığını veya eksi yanlarını bildiğimiz halde implemente etmekten kaçamadığımız veya implemente…

2 years ago

Providing Atomicity for Eventual Consistency with Outbox Pattern in .NET Microservices

{:tr}Bildiğimiz gibi microservice architecture'ına adapte olmanın bir çok artı noktası olduğu gibi, maalesef getirdiği bazı…

2 years ago

Building Microservices by Using Dapr and .NET with Minimum Effort – 02 (Azure Container Apps)

{:tr}Bir önceki makale serisinde Dapr projesinden ve faydalarından bahsedip, local ortamda self-hosted mode olarak .NET…

2 years ago