RabbitMQ #3 — Direct Exchange
Önceki Bölümlerden Hızlı Bir Göz Gezdirme
Merhaba dostlar! Sizlere, RabbitMQ’nun Exchange ve Binding kavramlarını daha önceki makalelerimizde tanıtmıştık. Exchange, mesajların alınması ve yönlendirilmesiyle görevlidir, Binding ise Exchange ve kuyruklar arasında ilişki kurar. Bu makalede, önceki bölümlerde öğrendiklerimizi hatırlayarak, Direct Exchange ile mesaj yönlendirme konusunu ele alacağız.
Direct Exchange: Mesajları Hedef Kuyruklara Doğrudan Yönlendirme
Direct Exchange, mesajları doğrudan belirlenen hedef kuyruklara yönlendiren bir Exchange türüdür. Bu Exchange türünde, mesajlar bir yönlendirme anahtarı (routing key) kullanılarak belirli bir kuyruğa yönlendirilir. Yani, mesajlar sadece belirli bir yönlendirme anahtarına sahip olan kuyruklara teslim edilir.
Direct exchange, RabbitMQ’nun mesajları doğrudan kuyruklara yönlendiren bir exchange türüdür. Bu exchange türü, mesajları yönlendirmek için bir yönlendirme anahtarı (routing key) kullanır. Her kuyruk, belirli bir yönlendirme anahtarını bekler ve yalnızca bu anahtarla eşleşen mesajları alır.
Bir direct exchange’in çalışma mantığı şu şekildedir:
- Yayıncı (publisher), mesajı belirli bir yönlendirme anahtarı ile birlikte direct exchange’e gönderir.
- Direct exchange, yönlendirme anahtarına göre mesajı ilgili kuyruklara yönlendirir.
- Her bir kuyruk, beklediği yönlendirme anahtarına sahip olan mesajları alır.
- Tüketici (consumer), kuyruktan mesajları alarak işler.
Direct exchange, mesajların doğrudan hedeflenen kuyruklara yönlendirilmesini sağladığından, yayıncı ve tüketici arasında doğrudan bir bağlantı kurulmasına olanak tanır. Bu, mesajların belirli alıcılarla iletişim kurmak için kullanıldığı senaryolarda oldukça kullanışlıdır.
Direct exchange kullanarak bir senaryo hayal edelim: Bir e-ticaret platformunda farklı ürün kategorileri bulunmaktadır (örneğin, elektronik, giyim, ev eşyaları). Her bir kategori için ayrı bir kuyruk oluşturarak, ilgili kategorideki ürünlerin müşterilere gönderilmesini sağlayabiliriz. Yayıncı, ürünün kategorisine göre bir yönlendirme anahtarı belirler ve bu anahtarla birlikte ürün mesajını direct exchange’e gönderir. Direct exchange, mesajı ilgili kategorinin kuyruğuna yönlendirir ve tüketici, kendi ilgilendiği kategorideki ürünleri alır.
Direct exchange, birbiriyle bağlantılı olmayan çoklu kuyruklar arasında veri yönlendirmesi sağlamak için ideal bir seçenektir. Her bir yönlendirme anahtarı, bir mesajın belirli bir kuyruğa yönlendirilmesini hedefler ve mesajlar yalnızca ilgili kuyruklara iletilir.
Direct Exchange’i daha iyi anlamak için bir senaryo üzerinden ilerleyelim:
Senaryo 1: Log Yönetimi
Bir uygulama loglarını yönetmek istediğinizi hayal edin. Log mesajları belirli bir seviyeye (örneğin, “info”, “warning”, “error”) sahip olacaktır. Bu log mesajlarını ilgili seviyelere göre yönlendirmek için RabbitMQ’nun direct exchange tipini kullanabiliriz.
Publisher Katmanı:
Yayıncı, log mesajlarını bir Exchange’e gönderir ve Exchange, bu log mesajlarını ilgili kuyruklara yönlendirir. İşte bir örnek:
using RabbitMQ.Client;
using System;
using System.Text;
public class Publisher
{
private const string ExchangeName = "LogsExchange";
public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, ExchangeType.Direct);
while (true)
{
Console.Write("Enter a log message: ");
var logMessage = Console.ReadLine();
Console.Write("Enter the log level (info, warning, error): ");
var logLevel = Console.ReadLine();
var message = Encoding.UTF8.GetBytes(logMessage);
channel.BasicPublish(ExchangeName, logLevel, null, message);
Console.WriteLine("Log message published successfully!");
Console.WriteLine();
}
}
}
}
Yukarıdaki örnekte, Publisher
sınıfı log mesajlarını bir Exchange'e göndermek için RabbitMQ bağlantısını kullanır. ExchangeName
sabit değişkeni, log mesajlarını yönlendireceğimiz Exchange'in adını temsil eder. Kullanıcıdan alınan log mesajı ve seviye bilgisi, bir mesaj olarak Exchange'e yayınlanır.
Consumer Katmanı:
Abone, log mesajlarını almak ve işlemek için bir kuyruk oluşturur. Exchange, log mesajlarını ilgili seviyelere göre ilgili kuyruklara yönlendirir. İşte bir örnek:
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
public class Consumer
{
private const string ExchangeName = "LogsExchange";
public static void Main(string[] args)
{
var logLevels = args;
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, ExchangeType.Direct);
var queueName = channel.QueueDeclare().QueueName;
foreach (var logLevel in logLevels)
{
channel.QueueBind(queueName, ExchangeName, logLevel);
}
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var logMessage = Encoding.UTF8.GetString(ea.Body.ToArray());
var routingKey = ea.RoutingKey;
Console.WriteLine($"Received log message: [{routingKey}] {logMessage}");
};
channel.BasicConsume(queueName, true, consumer);
Console.WriteLine("Waiting for log messages...");
Console.ReadLine();
}
}
}
Yukarıdaki örnekte, Subscriber
sınıfı log mesajlarını almak için RabbitMQ bağlantısını kullanır. ExchangeName
sabit değişkeni, log mesajlarının yönlendirildiği Exchange'in adını temsil eder. Kuyruk oluşturulur ve her bir log seviyesi için Exchange ile bağlantı kurulur. Log mesajları alındığında, mesajın içeriği ve yönlendirme anahtarı (log seviyesi) konsola basılır.
Bu örnekte, log mesajlarını farklı seviyelere göre yönlendiren bir direct exchange senaryosunu ele aldık. Kendi senaryolarınıza uygun olarak Exchange adını, log seviyelerini ve ilgili işlemleri yapılandırabilirsiniz.
Senaryo 2: Kargo Takip Sistemi
Bir kargo takip sistemi kurduğunuzu hayal edin. Kargo durumunu müşterilere anlık olarak bildirmek istiyorsunuz. Bu durumda, RabbitMQ’nun direct exchange türünü kullanarak kargo durumu güncellemelerini ilgili müşterilere yönlendirebilirsiniz.
Publisher Katmanı:
using RabbitMQ.Client;
using System;
using System.Text;
public class Publisher
{
private const string ExchangeName = "CargoExchange";
public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, ExchangeType.Direct);
while (true)
{
Console.Write("Enter the cargo ID: ");
var cargoId = Console.ReadLine();
Console.Write("Enter the cargo status (in transit, delivered, failed): ");
var cargoStatus = Console.ReadLine();
var message = Encoding.UTF8.GetBytes(cargoStatus);
channel.BasicPublish(ExchangeName, cargoId, null, message);
Console.WriteLine("Cargo status updated successfully!");
Console.WriteLine();
}
}
}
}
Yukarıdaki örnekte, Publisher
sınıfı kargo durumunu güncelleyen işlevselliği kapsar. RabbitMQ bağlantısını oluşturur ve Exchange'i tanımlar. Kullanıcıdan alınan kargo ID ve durum bilgisi, bir mesaj olarak Exchange'e yayınlanır.
Consumer Katmanı:
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
public class Consumer
{
private const string ExchangeName = "CargoExchange";
public static void Main()
{
Console.Write("Enter the cargo ID to track: ");
var cargoId = Console.ReadLine();
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, ExchangeType.Direct);
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queueName, ExchangeName, cargoId);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var cargoStatus = Encoding.UTF8.GetString(ea.Body.ToArray());
Console.WriteLine($"Updated status for cargo {cargoId}: {cargoStatus}");
};
channel.BasicConsume(queueName, true, consumer);
Console.WriteLine("Waiting for cargo status updates...");
Console.ReadLine();
}
}
}
Yukarıdaki örnekte, Consumer
sınıfı kargo durumu güncellemelerini takip eden işlevselliği kapsar. RabbitMQ bağlantısını oluşturur ve Exchange ile bağlantı kurar. Belirli bir kargo ID'si için kuyruk oluşturulur ve Exchange ile bağlantı kurulur. Kargo durumu güncellemeleri alındığında, mesajın içeriği konsola basılır.
Bu örnekte, kargo takip sistemi için kargo durumu güncellemelerini yönlendiren bir direct exchange senaryosunu ele aldık. Her bir kargo için ayrı bir yönlendirme anahtarı (cargo ID) kullanarak ilgili müşterilere kargo durumunu aktarabilirsiniz.
Sonuç
Bu makalede, Direct Exchange kullanarak mesaj yönlendirme konusunu ele aldık. Direct Exchange, mesajları doğrudan belirli bir yönlendirme anahtarına sahip olan kuyruklara yönlendirir. Örnek senaryo üzerinden, RabbitMQ’nun gücünü hissedebilir ve mesajları doğru hedeflere yönlendirerek sisteminizi etkin bir şekilde tasarlayabilirsiniz.
RabbitMQ, mesaj tabanlı sistemlerin esnek ve güvenilir bir şekilde iletişim kurmasını sağlayan önemli bir araçtır. Exchange ve Binding kavramlarını doğru bir şekilde kullanarak, mesaj tabanlı mimarilerinizi optimize edebilir ve daha güçlü sistemler inşa edebilirsiniz.
Umarım bu makale, Direct Exchange ve mesaj yönlendirme konusunda size yardımcı olmuştur. Eğer başka sorularınız veya açıklamak istediğiniz konular varsa, size yardımcı olmaktan mutluluk duyarım.
Keyifli okumalar! 😊