Event-Driven Architecture Nedir?
Event-Driven Architecture (EDA), bir sistemdeki bileşenlerin olaylar (events) aracılığıyla birbirleriyle iletişim kurduğu bir mimaridir.
Temel Prensipler:
- Event Producer (Publisher): Bir olay meydana geldiğinde, olayı oluşturan bileşendir. (Örneğin, yeni bir kullanıcı kaydı yapıldığında olay üretilir)
- Event Broker (Message Queue): Olayları geçici veya kalıcı olarak saklayan ve abonelere (subscribers) dağıtan aracı sistemdir. (Kafka, RabbitMQ gibi)
- Event Consumer (Subscriber): Olayı dinleyen ve ona göre işlem yapan bileşendir.
🎯 Nasıl Çalışır?
- Producer bir olay (event) üretir →
UserCreatedEvent
- Bu olay Message Broker (Kafka, RabbitMQ) aracılığıyla kuyruğa gönderilir.
- Kuyrukta bekleyen olay, bir veya daha fazla Consumer tarafından dinlenir.
- Consumer, olayı işler ve gereken aksiyonları alır (örneğin, e-posta gönderimi, veri tabanına kayıt vb.)
🔌 Mesaj Kuyruğu Seçenekleri
Özellik | Kafka | RabbitMQ |
---|---|---|
Mesaj Teslim Garantisi | Exactly-Once, At-Least-Once | At-Least-Once |
Performans | Yüksek (Dağıtık yapı) | Düşük-orta |
Yedekleme | Log tabanlı (disk üzerinde tutulur) | Hafıza tabanlı (İsteğe göre disk) |
Routing (Yönlendirme) | Yok | Exchange yapısı ile |
Mesaj Sıralaması | Partition bazında garantili | FIFO yok, ancak sıra garantisi yapılabilir |
Transaction Desteği | Var (Kafka Transactions) | Var |
Kafka Mimarisi
Kafka tamamen dağıtık (distributed) ve log-based bir sistemdir.
Temel Kavramlar:
- Topic: Olayların yayınlandığı başlık
- Partition: Topic’lerin parçalara bölünmesi
- Producer: Mesajları üreten servis
- Consumer: Mesajları okuyan servis
- Broker: Mesajların saklandığı Kafka sunucusu
- Consumer Group: Birden fazla Consumer aynı grupta olabilir.
Kafka’da Mesaj Gönderimi
csharpCopyEditpublic class KafkaProducer
{
private readonly IProducer<string, string> _producer;
public KafkaProducer()
{
var config = new ProducerConfig
{
BootstrapServers = "localhost:9092"
};
_producer = new ProducerBuilder<string, string>(config).Build();
}
public async Task SendMessageAsync(string topic, string message)
{
await _producer.ProduceAsync(topic, new Message<string, string> { Key = Guid.NewGuid().ToString(), Value = message });
Console.WriteLine($"Message sent: {message}");
}
}
RabbitMQ Mimarisi
RabbitMQ ise message broker yapısında çalışır ve AMQP (Advanced Message Queuing Protocol) tabanlıdır.
Temel Kavramlar:
- Exchange: Mesajların yönlendirildiği bileşen
- Queue: Mesajların saklandığı yapı
- Binding: Exchange ile Queue arasında ilişki
- Publisher: Mesajları gönderir
- Consumer: Mesajları okur
RabbitMQ’da Mesaj Gönderimi
csharpCopyEditpublic class RabbitMQProducer
{
public static void SendMessage(string message)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine($"Sent: {message}");
}
}
Event-Driven Architecture + Microservices + Kafka 🔥
Bu yapı, özellikle senin geliştirdiğin File Sharing Secure projesi için çok uygun olur. Örneğin:
Olay | Producer | Consumer | Aksiyon |
---|---|---|---|
Dosya Yüklendi | File Service | Notification Service | E-posta Gönderimi |
Dosya Silindi | File Service | Logging Service | Log Kayıt |
Üyelik Oluşturuldu | Auth Service | Email Service | Aktivasyon Maili |
Transaction Yönetimi
Kafka’da Exactly-Once Processing sağlayarak, her olayın yalnızca bir kez işlenmesini garanti edebilirsin.
Retry Mekanizması
Mesaj kuyruğundaki mesajlar başarısız olduğunda Dead Letter Queue (DLQ) ile yeniden işleme alınabilir.
Hangisini Seçmelisin?
Senaryo | Kafka | RabbitMQ |
---|---|---|
Gerçek Zamanlı Akış | ✅ | ❌ |
Yüksek Performans | ✅ | ❌ |
Dağıtık Yapı | ✅ | ❌ |
Routing Gereksinimi | ❌ | ✅ |
Asenkron İşlem | ✅ | ✅ |
Proje Önerisi 🎯
Dosya yükleme, silme, paylaşma gibi işlemler için şu yapıyı kullanabilirsin:
- FileUploadedEvent → Kafka → Notification Service
- FileDeletedEvent → Kafka → Logging Service
- UserRegisteredEvent → Kafka → Email Service
🌐 Teknoloji Stack’i Önerisi
Bileşen | Teknoloji |
---|---|
API | ASP.NET Core Web API |
Mesaj Kuyruğu | Kafka |
Veritabanı | MongoDB + MSSQL |
Kimlik Doğrulama | Firebase veya Auth0 |
Cloud | Azure Blob Storage |
Sonuç
Event-Driven Architecture kullanarak File Sharing Secure projesini hem esnek, hem dağıtık hem de yüksek performanslı bir yapıya dönüştürebilirsin.