.Net Core ile “RabbitMQ” ya Giriş

Feyyaz Acet
5 min readMay 23, 2019

--

Merhaba arkadaşlar, bugünkü yazımda RabbitMQ nedir? RabbitMQ ile neler yapabiliriz? Sorularına cevap aramanın yanında .Net core projesi üzerinde bir örnek ile konuyu pekiştiriyor olacağız.

RabbitMQ Nedir, Ne zaman Kullanılır?

RabbitMQ erlang dili ile yazılmış en popüler (Kendileri öyle diyor) open source bir message brokerdır. Basitçe anlatmak gerekir ise amacı bir yerden aldığı veriyi (Producer) kendine abonman olan başka bir yere (Consumer) teslim etmektedir. (Tabiki sırayla.) Alternatifleri (Microsof Azure Service Bus, Apache Kafka,Msmq). Onpromise olarak kullanmak ile birlikte cloud üzerinde de deploy edebilirsiniz.Yine aynı şekilde docker image alıp container ayağa kaldırıp kullanabilirsiniz(Örneğimizde bu yoldan ilerleyeceğiz.). Anlık yapılmaya ihtiyaç olmayan işlemlerde kullanılması(Mail veya sms gönderimi, e-ticaret projelerinde sipariş sonrası fatura kesilmesi veya kargo entegrasyon işlemlerinin yapılması) ile ön planda olsa Scalable(ölçeklenebilir) uygulamaların olmazsa olmazıdır diyebilirim.(Genel olarak “Message broker”lar)

Protokol Desteği

Direk olarak AMQP (Advanced message Queue Protokol) desteklemek ile birlikte pluginler vasıtasıyla STOP (Simple or (Streaming) Text Orientated Messaging Protokol) gibi bir çok Messaging protokolu desteklemektedir.

Çalışma Mantığı

Burada önemli bir konuya değinmek istiyorum.Aşağıda da görüldüğü üzere Publisher (ben genel olarak producer olarak kullanıyorum) veriyi direk olarak “queue” ya değil excehange üzerinden iletmektedir. Yani aslında publisher “queue” yi bilmemektedir.Mesaj exchange üzerinden routing key’e göre “queue” ya iletilmektedir.

RabbitMQ Terimleri

Producer (Publisher): Mesajı oluşturan, gönderen veya sağlayan taraftır.

Consumer: Abone olduğu “queue” dan veriyi alıp işleyen tüketen taraftır.

Queue: Mesjın eklendiği ve Consumer tarafından abone olan kuyruktur.

Exchange: Mesajı yönlendirme için aracı olarak kullanılır. Producer tarafından “exchance” e iletilen mesaj, Exchange type(Header attribute), binding ve routing key yardımı ile queue iletmektedir.

Exchance Type: Mesajın hangi “queue”ya ne şekilde iletileceğini belirtir.(Bu konuya detaylı sonraki makalemde gireceğim)

Binding: Exchance ve queue arasındaki bağlantıdır.

RabbitMQ kurulum aşamasına girmeyeceğim. Uygulamada hızlıca kullanmak adına RabbitMQ docker image alarak devam edeceğim.

Aşağıdaki kodu çalıştırdığınızda sizin için RabbitMQ image almak ile birlikte container ayağa kalkacaktır.

docker run -d --hostname rabbit --name rabbit rabbitmq:3-management

Hemen ardından docker ps komutu çalıştırdığınızda aşağıda detayları bulunam rabbitMQ container ayağa kalkacaktır.

Şimdi RabbitMQ managament ekranı açalım. Eğer sizinde pcnizde ayağa kalkan ilk container ise rabbitMQ hostu ip olarak 127.17.0.2 alacaktır. Ya da hangi ip set ettiğini görmek isterseniz

docker inspect 20ef9a609e3c (container ID) çalıştırıp container detaylarına göz atabilirsiniz.

Bizim için önemli olan kısmın görüntüsünü paylaşıyorum.

Browser dan http://container-ip (örneğimiz için 172.17.0.2):15672/ linkini çalıştırdığımızda aşağıdaki gibi bir giriş ekranı ile karşılaşacaksınız.

Evet bu kadar konuştuk. Peki ama projeme RabbitMQ’yu nasıl dahil edebilirim. RabbitMQ C#, java, phython, go gibi bir çok popüler dili desteklemektedir.

Çalışma ortamınızda “.net core 2.2” ile birlikte “visual studio code” un yüklü olduğunu varsayıyorum.

Bilgisayarınızda Visual Studio Code yok ise buradan net core 2.2 yok ise buradan indirebilirsiniz.

Not:Çalışmaları ubuntu 18.4 üzerinde yapıyorum.

Terminal(Uçbirim)açıp aşağıdaki kodu çalıştırıyorum.

mkdir RabbitMQSample yazıp RabbitMQSample adında bir klasör oluşturup cd RabbitMQSample ile ilgili dizine giriyoruz.

dotnet new mvc –name=RabbitMQSample.Producer ile bir .net core mvc projesi oluşturuyoruz.

Daha sonra sonra cd RabbitMQSample.Producer ile Producer tarafını oluşturacağımız Mvc proje dizinine giriyoruz. Ilgili dizin içerisinde code. komutu ile projemizi Visual Studio Code ile açıyoruz.

Daha sonra dilerseniz dotnet run komutu ile projenin ayağa kalktığını görebiliriz.

Şimdi sıra geldi projemize RabbitMQ C# kütüphaneleri proje dahil etmeye. RabbitMQ client kütüphanelerini yüklemek için dotnet add package RabbitMQ.Client komutunu çalıştırmanız yeterli.

Üsteki komutu çalıştırmanız ile birlikte RabbitMQ client kütüphanesi projemize dahil olmuş olacak. Konudan uzaklaşmamak adına herhangi bir ekran düzenlemesi yapmadan direk HomeController Index methodunda kuyruğa veriyi gönderiyor olacağım.

Yazdığımız kodda ne yapacağımıza bakacak olursak, öncelikle ConnectionFactory ile connection bilgilerimizi geçerek bir connection tanımladık. CreateModel ile bir channel oluşturduk. Mesaj bu channel üzerinden exchange tipi ile birlikte routing Key’e göre “queue” ya aktarılacaktır.

Bununla birlikte queue nun nasıl davraması gerektiği ile ilgili bir takım bilgileri set ettik.

Queue Properties

Name: Tanımlamış olduğumuz kuyruğun adı.

Durable: kuyruğun yaşam süresi ile alakalı. Eğer persistence olmasını istersek true set etmeliyiz. Biz örneğimiz için in-memory olacak şekilde oluşturuyor olacağız. Bu durumda broker restart olduğununda queue silinmiş olacak.

Exclusive: Kuyruğun başka connectionlar ile birlikte kullanıp kullanılmayacağı bilgisini içerir.

AutoDelete: Kuyruğa gönderilen veri consumer tarafına geçmesi ile birlikte kuyruğun silinmesi ile ilgili bilgiyi içerir.

Son olarak mesaj byte[] dizisine çevirilir ve body kısmına atanır.

Projeyi tekardan dotnet run ile çalıştırdığımızda şey yolunda gitti ise, home/Index sayfasını browserdan gördüyseniz RabbitMQ management ekranlarına kullanıcı adı:guest şifre: guest ile giriş yapıp queues sekmesine geldiğimizde aşağıdaki gibi ekran ile karşılaşıyor olacağız.Evet gördüğünüz gibi mesajımız başarıyla kuyruğa girmiştir.

Şimdi sıra geldi Consumer projesini oluşturmaya.

dotnet new console –name=RabbitMQSample.Consumer komut ile Consumer side için bir console uygulaması oluşturuyoruz.

cd RabbitMQSample.Consumer ile ilgili dizine girdikten sonra code . ile Consumer projemizi “Visual Studio Code” ile açıyoruz.

Projemizin açılması ile birlikte Consumer için gerekli kodlarımız program.cs içerinde main methoduna yazıyoruz.

Mesaj gönderme işlemimizden farklı olarak bir Consumer örneği alarak Received eventine mesajı işledğimiz anonymous methodu bağlıyoruz.

Daha sonra projemizi dotnet run ile çalıştırdığımızda aşağıda görüldüğü gibi mesajımız “Cosumer”a iletilecektir.

Son olarak RabbitMQ managemet arayüzünden “queue” yi kontrol ettiğimizde bekleyen mesajın 0 olduğunu göreceksiniz.

3 bölüm şeklinde planladığım serinin 1. bölümü bitirdik. Bir sonraki makalemde Exchange type ile ilgili detaylara inip neler yapabileceğimize göz atıyor olacağız.

Kaynak https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html

Proje kodlarına buradan ulaşabilirsiniz.

Şimdilik sağlıcakla.

--

--