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
Daha sonra services kısmından RabitMq servisini tekrar başlatınız ve http://localhost:15672/ adresini kontrol ediniz.
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.
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.
Ş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.
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