2, Mar 2025
Microservicelerde Event-Driven Mimariler ile Veri Senkronizasyonu Nasıl Sağlanır?

Event-Driven mimariler, mikroservisler arasında gevşek bağlı (loosely coupled) ve asenkron iletişim sağlayan bir yapı olarak modern yazılım geliştirmede çok önemli bir rol oynar.

Dağıtık mikroservis mimarilerinde veri tutarlılığı sağlamak zor bir iştir çünkü her mikroservis kendi veritabanını yönetir (Database Per Service Pattern). Bunun sonucunda veri senkronizasyonu için Event-Driven Architecture kullanmak kaçınılmaz olur.


🔑 Event-Driven Mimari Nedir?

Event-Driven Mimari, bir olayın (event) meydana geldiğinde bunu diğer servislerin dinleyip işlem yapmasını sağlayan bir yapıdır.


Basit Bir Akış

👉 OrderService: Sipariş oluşturur ve OrderCreated event’i yayınlar
👉 PaymentService: OrderCreated event’ini dinler ve ödemeyi alır
👉 StockService: Ödeme başarılı olursa PaymentSuccess event’ini dinler ve stok azaltır
👉 NotificationService: Stok güncellendiyse müşteriye bildirim gönderir


🎯 Bu Mimarinin Avantajları

ÖzellikAçıklama
Gevşek BağlılıkServisler birbirinden bağımsız çalışır
Yüksek PerformansServisler asenkron çalışır
Ölçeklenebilirlikİstekler kuyrukta bekler, ölçeklenme kolaydır
Hata ToleransıBir servis hata yapsa bile diğerleri çalışmaya devam eder
Veri TutarlılığıEvent Sourcing + Outbox Pattern ile sağlanır

🛠️ Temel Kavramlar

KavramAçıklama
EventMeydana gelen olay (örn: OrderCreated)
PublisherOlayı yayınlayan servis
SubscriberOlayı dinleyen servis
Event BrokerMesajları ileten altyapı (örn: RabbitMQ, Kafka, Azure Service Bus)
Outbox PatternVeri kaydedildiğinde aynı anda bir event’i de kaydeder

🔑 Event Broker Seçenekleri

BrokerAçıklamaKullanım Alanı
RabbitMQHafif ve hızlıKüçük ve orta ölçekli projeler
Apache KafkaYüksek hacimli veriBüyük veri işleme, gerçek zamanlı işlemler
Azure Service BusAzure cloud nativeAzure üzerinde çalışan projeler
Amazon SQSAWS nativeAWS üzerinde çalışan projeler


⚙️ Event-Driven Mimari Kurulumu (C# + .NET Core + RabbitMQ)



1. Publisher (OrderService)

Paket Yükleme:

bashCopyEditInstall-Package MassTransit
Install-Package MassTransit.RabbitMQ

Event Modeli:

csharpCopyEditpublic class OrderCreated
{
    public Guid OrderId { get; set; }
    public decimal Amount { get; set; }
}

Publisher:

csharpCopyEditpublic class OrderService
{
    private readonly IBus _bus;

    public OrderService(IBus bus)
    {
        _bus = bus;
    }

    public async Task CreateOrder(Guid orderId, decimal amount)
    {
        Console.WriteLine($"Order {orderId} Created");

        await _bus.Publish(new OrderCreated
        {
            OrderId = orderId,
            Amount = amount
        });
    }
}

2. Subscriber (PaymentService)

csharpCopyEditpublic class PaymentConsumer : IConsumer<OrderCreated>
{
    public async Task Consume(ConsumeContext<OrderCreated> context)
    {
        Console.WriteLine($"Payment Processed for Order {context.Message.OrderId}");
    }
}

Startup.cs

csharpCopyEditservices.AddMassTransit(x =>
{
    x.AddConsumer<PaymentConsumer>();
    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("rabbitmq://localhost");
        cfg.ReceiveEndpoint("order-created-queue", e =>
        {
            e.ConfigureConsumer<PaymentConsumer>(context);
        });
    });
});


🔥 Veri Senkronizasyonu için Outbox Pattern

Outbox Pattern, dağıtık sistemlerde veri tutarlılığı sağlamak için kullanılır.

👉 Adımlar:

  1. Event’i önce bir Outbox tablosuna yaz
  2. Event işlendikten sonra mesaj kuyruğuna gönder
  3. Eğer kuyruğa gönderilmezse, retry mekanizması ile tekrar dener

Outbox Tablosu:

IDEvent NamePayloadProcessedCreatedAt
1OrderCreated{OrderId:1}false2025-03-02


🔁 Transactional Outbox

Entity Class:

csharpCopyEditpublic class OutboxMessage
{
    public Guid Id { get; set; }
    public string EventName { get; set; }
    public string Payload { get; set; }
    public bool Processed { get; set; }
    public DateTime CreatedAt { get; set; }
}


🔑 Idempotency (Tekrarlanabilirlik)

Event’lerin birden fazla işlenmesini önlemek için Idempotency mekanizması uygulanır.

Bunu sağlamak için her event’e bir CorrelationId eklenir.



🌐 Azure Service Bus ile Event-Driven

Azure’da Service Bus kullanarak Event-Driven mimariyi çok kolay bir şekilde kurabilirsiniz.

bashCopyEditInstall-Package Azure.Messaging.ServiceBus


📌 Best Practices

ProblemÇözüm
Veri TutarsızlığıOutbox Pattern
İstek TekrarıIdempotent Event
Hata YönetimiRetry Policy
PerformansEvent Batching


Hangisini Seçmeliyim?

ÖzellikRabbitMQKafkaAzure Service Bus
Cloud Native
Yüksek Hacim
Transactional
Kolay Kurulum


🎯 Senin Proje Yapın İçin Önerim

ServisEvent BrokerPattern
Dosya YüklemeAzure Service BusChoreography
E-Mail BildirimiAzure Service BusChoreography
Stok GüncellemeAzure Service BusChoreography
LoglamaAzure BlobOutbox


Sonuç

✅ Veri Senkronizasyonu
✅ Asenkron Çalışma
✅ Ölçeklenebilirlik
✅ Hata Toleransı

Bir yanıt yazın

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