4, Mar 2025
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:

  1. 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)
  2. Event Broker (Message Queue): Olayları geçici veya kalıcı olarak saklayan ve abonelere (subscribers) dağıtan aracı sistemdir. (Kafka, RabbitMQ gibi)
  3. Event Consumer (Subscriber): Olayı dinleyen ve ona göre işlem yapan bileşendir.

🎯 Nasıl Çalışır?

  1. Producer bir olay (event) üretir → UserCreatedEvent
  2. Bu olay Message Broker (Kafka, RabbitMQ) aracılığıyla kuyruğa gönderilir.
  3. Kuyrukta bekleyen olay, bir veya daha fazla Consumer tarafından dinlenir.
  4. 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

ÖzellikKafkaRabbitMQ
Mesaj Teslim GarantisiExactly-Once, At-Least-OnceAt-Least-Once
PerformansYüksek (Dağıtık yapı)Düşük-orta
YedeklemeLog tabanlı (disk üzerinde tutulur)Hafıza tabanlı (İsteğe göre disk)
Routing (Yönlendirme)YokExchange yapısı ile
Mesaj SıralamasıPartition bazında garantiliFIFO yok, ancak sıra garantisi yapılabilir
Transaction DesteğiVar (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:

OlayProducerConsumerAksiyon
Dosya YüklendiFile ServiceNotification ServiceE-posta Gönderimi
Dosya SilindiFile ServiceLogging ServiceLog Kayıt
Üyelik OluşturulduAuth ServiceEmail ServiceAktivasyon 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?

SenaryoKafkaRabbitMQ
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:

  1. FileUploadedEvent → Kafka → Notification Service
  2. FileDeletedEvent → Kafka → Logging Service
  3. UserRegisteredEvent → Kafka → Email Service


🌐 Teknoloji Stack’i Önerisi

BileşenTeknoloji
APIASP.NET Core Web API
Mesaj KuyruğuKafka
VeritabanıMongoDB + MSSQL
Kimlik DoğrulamaFirebase veya Auth0
CloudAzure 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir