RabbitMQ Nedir? Docker Üzerinde Çalışan RabbitMQ ile .NET Core Nasıl Haberleşir?

Emre Balcı
Devops Türkiye☁️ 🐧 🐳 ☸️
5 min readJul 9, 2019

Hiç sırf sıra var diye merak edip sıranın bir ucuna geçtiğiniz oldu mu? Ben bir kaç kişi tanıyorum :) Nedendir bilinmez galiba Türk insanı olarak sıraya girmeyi çok seviyoruz. Aslında şöyle bir baktığımızda hayatımızda her şeyi belirli bir sıraya göre yapıyoruz. Önceliklerimizi sıralandırıyoruz. Daha sonra sırasıyla bu işleri yapıyoruz. Örneğin bir bankaya gittiğimizde ilk yaptığımız şey numaratörden sıra almak oluyor. Çünkü gişedeki memurlar bu sıraya göre işlem yapıyor. Düşünsenize sıra olmadan işlem yaptırmaya çalıştığınızı tam bir kaos.

  • RabbitMQ Nedir?

İşte RabbitMQ da yazılım dünyasındaki numaratör(producer) gibidir. Yani istekleri belirli bir sıraya sokup bir kuyruk oluşturur. Bu kuyruk kendi hafızasına kaydeder. Daha sonra bir consumer(yani örneğimizdeki memur) tarafından bu işlemler alınır ve yerine getirilir. Eğer consume’un başına bir şey gelirse bu sıra kaybolmaz. Yani consumer tekrar çalıştığında kaldığı sıradan devam eder.

  • Docker Üzerinden RabbitMQ Nasıl Çalıştırılır?

Öncelikle eğer docker bilgisayarınızda kurulu değil ise buradan nasıl kurulacağına bakabilirsiniz.

RabbitMQ’yu docker üzerinden çalıştırmak için bir komut satırı açıyoruz.

RabbitMQ kurulması için docker komutu

hostname: RabbitMQ’nun clusterının host adıdır. Buradaki ismi kendiniz yazabilirsiniz. Ben hostname adını my-rabbit olarak verdim. İsterseniz değiştirebilirsiniz.

name: docker üzerinde gözükecek ad. Buradaki ismi kendiniz yazabilirsiniz. Ben name adınımyrabbit olarak verdim. İsterseniz değiştirebilirsiniz.

-e RABBITMQ_DEFAULT_USER: RabbitMQ oluşturulurken default olarak user yaratması için gerekli olan komuttur. Bu kullanıcı ile işlemlerimizi gerçekleştireceğiz. Ben kullanıcı ismini admin olarak verdim. İsterseniz değiştirebilirsiniz.

-e RABBITMQ_DEFAULT_PASS: Yaratacağımız kullanıcıya vereceğimiz şifredir.

-p 15672:15672: Ulaşmak istediğimiz portun tanımlandığı yerdir. Ben 15672 portunu verdim. Yani localhost:15672 urli üzerinden erişeceğim. İsterseniz değiştirebilirsiniz.

localhost:15672 urlinden RabbitMQ’nun çalışıp çalışmadığına bakalım.

RabbitMQ hazır olduğuna göre artık yapacağımız örnek projeye geçebiliriz.

  • Peki Örnek Projemizin Konusu Nedir?

Bankalardaki EFT işleminin bir simülasyonunu yapalım. Sistemde var olan biri başka birine para göndersin. Bu işlem kuyruğa alınsın ve daha sonra işlem gerçekleştiğinde bir mesajla bilgilendirilsin. Daha sonra kullanıcıları listelediğimiz de göndericiden o paranın düştüğünü, gönderilene de o paranın yatırıldığını göreceğimiz bir uygulama yapalım.

Örnek projemizdeki producer(para gönderme işlemi) oluşturmakla başlayalım.

Projemizi oluşturacağımız dizine gelip, dotnet new webapi -n simple_rabbitmq_eft.Api komutunu çalıştırarak yeni bir web api projesi yaratalım. Projemiz oluşturulduktan sonra RabbitMQ ile olan işlerimizi yapabilmemiz için gerekli olan nuget paketini yükleyelim. Bunun için dotnet add package Rabbitmq.Client komutunu çalıştıralım.

Daha sonra para gönderme işlemlerini simüle etmek için bir katman oluşturalım.

  • Database katmanının oluşturulması

Bu katmanda veri tabanından müşterilerimizi bulan, para gönderme işlemlerimizi yapan servislerimiz yer alacak. Tabii biz bu işlemleri simüle ettiğimiz için veri tabanı olarak bir json dosyası kullanacağız.

Katmanı oluşturmak için dotnet new classlib simple_rabbitmq_eft.Database komutunu çalıştırıyoruz.

Daha sonra, models adında bir klasör açıyoruz ve içerisine Customer adında bir class açıyoruz. Bu class müşterimizi temsil edecek.

Models/Customer.cs

Kullanıcıdan alacağımız gönderici bilgileri ve göndereceği para miktarını almak için kullanacağımız SendingEftModel adında bir class daha açıyoruz.

Models/SendingEftModel.cs

Gerekli modelleri oluşturduğumuza göre sıra eft işlemlerini simüle edecek olan classımızı oluşturmaya geldi. EftContext adında bir class açıyoruz.

EftContext.cs

Eğer Database.json dosyası boş ise; İlk datalar regionındaki SampleCustomers listesinin içerisindeki bütün dataları Database.json’a yazmasını söyledik.

Send methodunda gönderen ve gönderilen müşterileri bulmasını ve hesaplarındaki parayı gönderilen paraya göre düzenlenmesini daha sonrada oluşan yeni datayı Database.json dosyasına yazmasını söylemiş oluyoruz.

Database katmanında yapacağımız işlemler bu kadar.

Şimdi Api tarafına dönüp Producer’ımızı oluşturalım. Bunun için simple_rabbitmq_eft.Api projesinin içerisine Helpers adında bir klasör açıyoruz ve içerisine EftProducerHelper adında bir class tanımlıyoruz.

Bu Class’ta RabbitMQ da “Eft” adında bir kuyruk yaratmasını söyledik. Bu kuyruğa müşteri bilgileri ve göndereceği para miktarı yer alan modelimiz olan SendigEftModel’i json serialize ederek kuyruğumuza verdik. Consumerlarımız buradaki modeli alıp işlemi gerçekleştirecek.

ConnectionFactory de Username ve Password kısmına RabbitMQ yu docker üzerinden ayağa kaldırırken hangi kullanıcı adını ve şifreyi yazdıysak onu yazıyoruz.

SendingEftModel Database katmanının içerisinde olduğu için Database katmanını referans eklememiz gerekiyor. Eğer bunu dotnet-cli ile yapacak olursak; dotnet add simple_rabbitmq_eft.Api/simple_rabbitmq_eft.Api.csproj reference simple_rabbitmq_eft.Database/simple_rabbitmq_eft.Database.csproj komutunu çalıştırıyoruz.

Helper’ı oluşturduğumuza göre artık bir endpoint tanımlayarak para gönderme işlemlerini yapabileceğimiz bir controller oluşturmamız gerekiyor. Bunun için EftControllers adında bir controller açıyoruz.

Controllerımızda hazır olduğuna göre Producer tarafında yapacağımız bir şey kalmadı. Consumer tarafına geçmeden önce çalışıp çalışmadığını görmek için bir test edelim.

Api projemizi dotnet run komutuyla çalıştırıyoruz.

Postman yardımıyla 3 Id’li müşterinin 1 Id’li müşteriye 20 lira gönderelim.

Sorgumuzu çalıştırdığımızda “EFT İsteğiniz listelenmiştir.” bilgisinin döndüğünü görüyoruz. RabbitMQ tarafında Eft adında bir kuyruğun açılıp açılmadığına bakalım. Bunun için localhost:15672 urline gidip, giriş yapalım.

Eft adında bir kuyruk açılmış ve şuanda içerisinde 1 tane datanın var olduğunu görüyoruz.

Eğer Eft kuyruğunun detaylı bilgisine ulaşmak istersek, kuyruğun adına(Eft) tıklamanız yeterli. Açılan sayfada kuyruğumuz ile ilgili tüm bilgilere ulaşabiliriz. İçerisine gönderdiğimiz mesajı görmek için sayfanın aşağısındaki Get messages kısmına bakmamız yeterli.

Gönderdiğimiz bilgilerin kuyruğumuza başarıyla gittiğini görüyoruz.

Böylece Producer kısımda yaptığımız her şeyin düzgün çalıştığını test etmiş olduk. Şimdi comsumer kısmını oluşturup Eft kuyruğunda olan verileri consume (kuyruktan verileri okuyan ve bu veriler ile işlem yapan) eden bir console uygulaması yaparak örneğimize devam ediyoruz.

  • Consumer’ın oluşturulması

Bunun için projemizin dizininde dotnet new console -n simple_rabbitmq_eft.Consumer komutunu çalıştırıyoruz. Bu komutla simple_rabbitmq_eft.Consumer adında bir console uygulaması açmış oluyoruz.

RabbitMQ dan Eft kuyruğunu consume edebilmemiz için Rabitmq.Client kütüphanesine ihtiyacımız var. Bunun için dotnet add package Rabbitmq.Client komutunu çalıştıralım.

Daha sonra Database.json adında bir dosya oluşturalım. Müşterilerimizin bilgileri bu json dosyasına kaydedilecek.

Database katmanında eğer Json dosyamızda herhangi bir şey bulamazsa kendisi dummy data basacak şekilde ayarlamıştık.

Json dosyamızı oluşturduktan sonra artık consumerımızı oluşturabiliriz. Bunun için Program.cs içine gidelim.

RabbitMQ ya bağlanıp burada “Eft” kuyruğunu dinlemeye başladık. Kuyruğumuzdan gelen dataları EftContext’in Send methoduna yolladık. Send methodunda ilgili müşterileri bulup, “balance” değerlerini ona göre değiştiriyor. Böylece simülasyon tamamlanıyor.

Consumerımız da hazır olduğuna göre artık dotnet run komutuyla çalıştırıp, kuyruğu dinleyip json dosyamızda ilgili değişikliğin olup olmadığına bakalım.

Consumer ilk çalıştığında Database.json dosyamızın içi boş olduğu için ilk datalar şu şekilde olacaktır.

Consumer ilk çalıştığı andaki Database.json
Yukarıda test ederken kuyruğa attığımız data da 3 Id numaralı kullanıcı 1 Id numaralı kullanıcıya 20₺ gönderecek şekildeydi. Consumer’ın yazdığı mesaja bakarsak ilgili datayı doğru bir şekilde almış olduğunu görüyoruz.

Consumer’ın datayı aldığını gördük. Bakalım Database.json dosyamız ne şekilde değişti.

3 Id numaralı müşteriden “Balance” özelliğinden 20₺ düşüldüğü, 1 Id numaralı müşteriye ise 20₺ eklendiğini görüyoruz.

Bir de RabbitMQ ya bakalım. Kuyruğun son durumu ne olmuş.

Consumer işlemleri başarıyla gerçekleştirdiği için kuyrukta herhangi bir data göremiyoruz.

Böylece Eft simülasyonunu tamamlamış oluyoruz. Yaptığımız bu projeye buradan ulaşabilirsiniz.

Okuduğunuz için teşekkür ederim.

Sağlıcakla kalın…

--

--