Merhaba arkadaşlar, bugün sizlere .Net Core ve Rabbit MQ ile ilgili ufak bir örnek yaparak, basitçe message queue yapısından bahsetmek istiyorum.

Öncelikle Rabbit MQ’yu kulanabilmek için bilgisayarınızda Erlang’in ve RabbitMQ’nun kurulu olması gerekir.

Erlang kurulum linki : http://www.erlang.org/downloads
RabbitMQ kurulum linki: http://www.rabbitmq.com/install-windows.html
(Şuan ki sürüm 3.7.9)

Kurulumlar tamamlandıktan sonra Command Line Ekranında aşağıdaki komutu yazınız.

C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.9\sbin\rabbitmq-plugins.bat enable rabbitmq_management
Image for post
Image for post
Cmd-Rabbit Enable

Daha sonra services kısmından RabitMq servisini tekrar başlatınız ve http://localhost:15672/ adresini kontrol ediniz.

RabbitMQ-Service

Default port 15672 olarak kurulur. Dashboard içerisine girerken username ve password alanı karşınıza çıkacaktır. RabbitMQ dökümanında default username ve password “guest” olarak belirlenmiştir.

Evet Sonunda aşağıdaki gibi bir ekrana ulaştıysanız RabbitMQ kurulumunu başarı ile yapmışsınızdır.

Image for post
Image for post
RabbitMQ-Dashboard

RabbitMQ en popüler Message Queue yapılarından biridir. Ücretsiz ve Erlang üzerine yazıldığı için hızlı bir yapıdır.

Peki message queue lar / kuyruk yapıları neden kullanılır?

Farklı kuyruk yapılarının birbirine göre avantajlı olduğu yönler olsa da genel olarak benim gördüğüm , asenkron olarak yapılan işlemleri bir kuyruk yapısına aktararak sıra ile işleme girmesini sağlayarak veri kaybını azaltmak ve izlenilebilirliği arttırmak için kullanılır. Yada logların kuyruğa atılarak daha sonra buradan bu logların analizinin yapılması, aksiyon alınması vb. gibi senaryolarda kullanılmaktadır.

Basitçe yapısını açıklamak gerekirse

Producer = Mesajın kaynağı, gönderim yapan taraftır.
Queue = Kuyruk dediğimiz kısımdır. Rabbit mq da işlem sırası ilk giren ilk çıkar şeklindedir. (fifo-first in first out).
Consumer= Mesajı alan, ilgili kuyruğun aktarımını bekleyen taraftır.

Şimdi geçelim uygulamamıza. Basitçe yapmak istediğimiz bir console uygulaması verilen mesajı RabbitMQ’ya gönderecek (producer),
başka bir console uygulamamızda 1 saniye bekleyecek ve o mesajı alarak, objeyi deserialize ederek ekranda gösterecek.
Bunun için Newtonsoft.Json ve RabbitMQ.Client paketlerinden yaranlanacağız. Nuget üzerinden indirebilir yada package manager console içerisine alttaki kodları yazabilirsiniz.

Install-package Newtonsoft.Json
Install-package RabbitMQ.Client

Producer Uygulamamız

class Program
{
static void Main(string[] args)
{
User user = new User() { Name = “Enes A.”, Message = “Rabbit mq ilk giden mesaj” };
var factory = new ConnectionFactory() { HostName = “localhost” };
using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare(queue: “EnesAys”,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
string message = JsonConvert.SerializeObject(user);
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: “”,
routingKey: “EnesAys”,
basicProperties: null,
body: body);
Console.WriteLine($”Gönderilen kişi: {user.Name}”);
}
Console.WriteLine(“ Mesaj gönderildi”);
Console.ReadLine();
}
}
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public string Message { get; set; }
}

Uygulamamızı çalıştırdığımızda console ekranında aşağıdaki gibi bir çıktı oluşmaktadır.

Gonderilen Kisi Enes A.Mesaj gonderildi.

Bununla beraber RabbirMQ panelimize bakarsak queue sekmesinde Enesays ile ilgili bir kayıt oluşmuştur.

Image for post
Image for post
RabbitMQ

Şimdi Geçelim Consumer Uygulamamıza;

class Program
{
static void Main(string[] args)
{
Thread.Sleep(1000); // wait one second and get message
var factory = new ConnectionFactory() { HostName = “localhost” };
using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare(queue: “EnesAys”,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
User user = JsonConvert.DeserializeObject<User>(message);
Console.WriteLine($” Adı: {user.Name} Mesaj [{user.Message}]”);
};
channel.BasicConsume(queue: “EnesAys”,
autoAck: true,
consumer: consumer);
Console.WriteLine(“ Mesaj kuyruktan alındı. Dashboarda bakın.”);
Console.ReadLine();
}
}
}
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public string Message { get; set; }
}

Consumer uygulamamızı çalıştırdığımızda çıktı aşağıdaki gibi olmalıdır.

Adi:Enes A. Mesaj [Rabbit mq ilk giden mesaj]
Mesaj kuyruktan alindi. Dashboarda bakin.

Şimdi tekrar RabbitMQ panelimize baktığımızda Queue altındaki kısımda mesajın gittiğini görebiliriz.

Image for post
Image for post
RabbitMQ-Queue

Kaynak koduna aşağıdaki adresten ulaşabilirsiniz. https://github.com/EnesAys/RabbitMq-NetCore

Kendim için faydalı bir deneme ve yazı olduğunu düşünüyorum. Umarım herkes içinde öyle olur. Herkese iyi hafta sonları 😀

Kaynakça
http://www.borakasmer.com/rabbitmq-nedir/ (Anlatımı ve örneklerini severek takip ediyorum. Herkese tavsiye ederim. )
https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html
https://www.rabbitmq.com/documentation.html

Software Developer at Sosyopix

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store