ASP.NET CORE'da RabbitMQ

ASP.NET CORE'da RabbitMQ

Merhaba, bu yazımda sizlere RabbitMQ hakkında bilgiler vereceğim ve ASP.NET CORE üzerinde uygulamasını anlatacağım. Basit bir örnek yapıyor olacağız.

RabbitMQ Nedir

RabbitMQ, açık kaynaklı bir mesaj kuyruğu sistemidir.AMQP(Advanced Message Queuing Protocol) adı verilen protokolü kullanır. Temelde asenkron olarak işlemleri sıraya koyacak yüksek performanslı yapıyı sağlar. Aynı zamanda bu sistem, uygulamalar arasında mesajların güvenilir bir şekilde iletilmesini sağlar. Mesaj kuyruğu, mesajların bir gönderici tarafından bir sıraya yerleştirildiği ve bir alıcı tarafından bu sıradan alındığı bir sistemdir. Özellikle Mikroservis mimarisinde sıkça kullanılmaktadır.

ASP.NET CORE RabbitMQ

Bilmemiz gereken bazı kavramlar;

  1. Kuyruk (Queue): Mesajların depolandığı yer. Kuyruklar, mesajları sırayla depolar ve alıcıların bu mesajları almasını bekler.
  2. Değişim(Exchange): Mesajları doğru kuyruğa yönlendiren bileşendir.
    Direct Exchange: Mesajları tam eşleşen bir anahtarla kuyruklara yönlendirir.
    Fanout Exchange: Mesajları tüm bağlı kuyruklara yönlendirir.
    Topic Exchange: Mesajları anahtar desenine göre kuyruklara yönlendirir.
    Headers Exchange: Mesajları başlık özniteliklerine göre kuyruklara yönlendirir.
  3. Bağlantı (Binding): Bir kuyruk ile değişim arasındaki bağlantıdır. Bağlantılar, mesajların hangi kuyruklara yönlendirileceğini belirler.
  4. Üretici (Producer): Mesajları gönderen uygulamadır. Üretici, mesajları bir değişime gönderir.
  5. Tüketici (Consumer): Mesajları alan uygulamadır. Tüketici, kuyruğa gelen mesajları alır ve işler.

Kurulum

RabbitMQ Servisi kurulumu oldukça basittir. Aşağıdaki 2 bağlantıya giderek, ERLANG ve RabbitMQ kurulumlarını gerçekleştirebilirsiniz.

ASP.NET CORE'da RabbitMQ Kullanımı

Öncelikle ASP.NET CORE için 2 yeni Console Application oluşturuyorum. Bu uygulamalardan biri üretici(Producer), diğeri ise tüketici(Consumer) uygulamaları olacak.
2 Uygulama için de aynı paketi kuruyorum.

dotnet add package RabbitMQ.Client

veya;

RabbitMQ Library for ASP.NET CORE

Producer kodunu inceleyelim;

ConnectionFactory connectionInfo = new ConnectionFactory()
{
    HostName = "localhost",
    Port = 5672,
    UserName = "guest",
    Password = "guest"
};

var user = Guid.NewGuid().ToString();

using (var cfConn = connectionInfo.CreateConnection())
{
    using (var channel = cfConn.CreateModel())
    {
        channel.QueueDeclare
        (
            queue: "chat_messages",
            durable: false,
            exclusive: false,
            autoDelete: false,
            arguments: null
        );
        while (true)
        {
            string userMessageText = Console.ReadLine();
            if (userMessageText == "Q")
                break;
            var message = new Message { MessageType = (int)MessageType.Message, MessageText = userMessageText, User = user };

            string strJson = JsonConvert.SerializeObject(message);
            byte[] byteMessage = Encoding.UTF8.GetBytes(strJson);

            channel.BasicPublish
            (
                exchange: "",
                routingKey: "chat_messages",
                basicProperties: null,
                body: byteMessage
            );
        }
    }
}

public class Message
{
    public int MessageType { get; set; }
    public string MessageText { get; set; }
    public string? User { get; set; }
}

public enum MessageType
{
    Info = 1,
    Message = 2
}

Bağlantı bilgilerimizi tanımladık, kullanıcı oluşturduk ve mesaj gönderme işlemlerini gerçekleştirdik. Test amaçlı bu uygulamadan 2 tane oluşturacağım.
Şimdi gelelim Consumer koduna;

var factory = new ConnectionFactory()
{
    HostName = "localhost",
    Port = 5672,
    UserName = "guest", 
    Password = "guest" 
};

using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.QueueDeclare(queue: "chat_messages",
                         durable: false,
                         exclusive: false,
                         autoDelete: false,
                         arguments: null);

    var consumer = new EventingBasicConsumer(channel);
    consumer.Received += (model, ea) =>
    {
        var body = ea.Body.ToArray();
        var message = Encoding.UTF8.GetString(body);
        var dMessage = JsonConvert.DeserializeObject<Message>(message);
        Console.WriteLine($"{dMessage.User}: {dMessage.MessageText}");
    };
    channel.BasicConsume(queue: "chat_messages",
                         autoAck: true,
                         consumer: consumer);

    Console.WriteLine("Messages:");
    Console.ReadLine();
}

public class Message
{
    public int MessageType { get; set; }
    public string MessageText { get; set; }
    public string? User { get; set; }
}

public enum MessageType
{
    Info = 1,
    Message = 2
}

Kodları inceleyerek, kendinize göre düzenleyip testlerinizi gerçekleştirebilirsiniz. Şimdi sonuca bakalım.

RabbitMQ Test
Sonuçlarda görüldüğü üzere; 2 farklı producer uygulamasından gönderdiğimiz mesajları, consumer tarafında okuyabiliyoruz. Testimizi başarıyla tamamlamış olduk.

 

Bu yazımda sizlere RabbitMQ hakkında bazı bilgilerden ve ASP.NET CORE'da uygulanmasından kısaca bahsettim.

Projenin kaynak dosyalarına buradan ulaşabilirsiniz.

Sabırla okuduğunuz için teşekkür eder, bol kodlu günler dilerim. 🤩

Kategoriler