Merhaba arkadaşlar, bu yazımda sizlere .Net Core RabbitMQ Kullanımı konusundan bahsedeceğim.
RabbitMQ, açık kaynak kodlu olan bir mesaj kuyruk sistemidir. RabbitMQ ile gönderilen mesajlar sırayla istenilen bir kuyruğa iletilebilir. AMQP(Advanced Message Queuing Protocol) protokolünü kullanmaktadır. Platform bağımsızdır. Uygulamalar arasında “sync/async” olmak üzere birçok farklı şekilde olabilir. Publish ve Subscribe yapısı bulunmaktadır. Producer ile bir mesaj iletilmesi sağlanır. Producer‘den iletilen mesajlar bir kuyruğa aktarılır. Consumer tarafından da ilgili kuyruk dinlemesi yapılarak bu mesajların işlenmesi sağlanabilir. Producer mesaj yayınlama, Consumer ise kuyruğu dinleyen ve işleyen yapı olarak tanımlayabiliriz.
.Net Core ile RabbitMQ Kullanımı
2 adet Console Application projesi oluşturuyoruz. Bu projelerden ilki Producer, diğeri de Consumer.
Ben burada .Net Core 6 versiyonu ile projelerimizi oluşturuyorum.
Projelerimizi oluşturduktan sonra Nuget Package Manager ile RabbitMQ.Client paketini yüklememiz gerekiyor.
Producer projemizde örnek kodlarımızı aşağıdaki gibi yazıyoruz.
var connectionFactory = new ConnectionFactory()
{
HostName = "localhost",
UserName = "guest",
Password = "guest",
};
using (var connection = connectionFactory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "log_queue",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var logMessage = new LogModel() { LogType = "Info", LogMessage = "Hello, RabbitMQ" };
string logMessageJson = JsonSerializer.Serialize(logMessage);
var body = Encoding.UTF8.GetBytes(logMessageJson);
channel.BasicPublish(exchange: "",
routingKey: "log_queue",
basicProperties: null,
body: body);
}
Öncelikle RabbitMQ için Connection Factory nesnesi oluşturarak Connection bilgilerimizi giriyoruz. Sonrasında Connection Factory nesnesi ile bir bağlantı oluşturuyoruz. Oluşturduğumuz bağlantı ile de bir Channel nesnesi oluşturuyoruz. Channel nesnesi ile QueueDeclare metodunu kullanarak kuyruğumuzu tanımlıyoruz. Eğer bu isimde bir kuyruk bulunuyorsa tanımlama gerçekleştirmiyor. Sonrasında LogModel nesnemizi tanımlıyoruz.
public class LogModel
{
public string LogType { get; set; }
public string LogMessage { get; set; }
}
Log nesnemiz içerisindeki bilgileri kuyruğumuza göndereceğiz. Bu işlemi sağlamak için de JSON formatına çeviriyoruz ve Byte[] tipine çevirme işlemini sağlıyoruz. Son olarak da BasicPublish metodumuzu kullanarak routingKey kısmında da oluşturduğumuz kuyruğun ismini vererek mesajın iletilme işlemini gerçekleştiriyoruz.
Consumer projemizde de örnek kodlarımızı aşağıdaki gibi yazıyoruz.
var factory = new ConnectionFactory()
{
HostName = "localhost",
UserName = "guest",
Password = "guest",
};
using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "log_queue",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, mq) =>
{
var body = mq.Body.ToArray();
var logMessageString = Encoding.UTF8.GetString(body);
Console.WriteLine($"Log message received: {logMessageString}");
var logMessage = JsonSerializer.Deserialize<LogModel>(logMessageString);
// Örn: veri tabanına ekle
// Örn: dosyaya kaydet
};
channel.BasicConsume(queue: "log_queue",
autoAck: true, //true ise mesaj otomatik olarak kuyruktan silinir
consumer: consumer);
Console.ReadLine();
}
Consumer projemizde de log_queue kuyruğumuzu dinliyoruz ve gelen mesajları okuyarak istediğimiz işlemi sağlayabiliriz. Veri tabanına eklemek, dosyaya yazdırmak gibi…
Umarım faydalı olur.
Bir sonraki yazıda görüşmek üzere…