RabbitMQ Nedir? Docker Üzerinde Çalışan RabbitMQ ile .NET Core Nasıl Haberleşir?
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.
— 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. Yanilocalhost: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.
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.
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.
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.
ConnectionFactory
deUsername
vePassword
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 bunudotnet-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çinlocalhost:15672
urline gidip, giriş yapalım.
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.
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.
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’ın datayı aldığını gördük. Bakalım Database.json
dosyamız ne şekilde değişti.
Bir de RabbitMQ ya bakalım. Kuyruğun son durumu ne olmuş.
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…