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ı
Özellik | Açıklama |
---|---|
Gevşek Bağlılık | Servisler birbirinden bağımsız çalışır |
Yüksek Performans | Servisler 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
Kavram | Açıklama |
---|---|
Event | Meydana gelen olay (örn: OrderCreated) |
Publisher | Olayı yayınlayan servis |
Subscriber | Olayı dinleyen servis |
Event Broker | Mesajları ileten altyapı (örn: RabbitMQ, Kafka, Azure Service Bus) |
Outbox Pattern | Veri kaydedildiğinde aynı anda bir event’i de kaydeder |
🔑 Event Broker Seçenekleri
Broker | Açıklama | Kullanım Alanı |
---|---|---|
RabbitMQ | Hafif ve hızlı | Küçük ve orta ölçekli projeler |
Apache Kafka | Yüksek hacimli veri | Büyük veri işleme, gerçek zamanlı işlemler |
Azure Service Bus | Azure cloud native | Azure üzerinde çalışan projeler |
Amazon SQS | AWS native | AWS ü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:
- Event’i önce bir Outbox tablosuna yaz
- Event işlendikten sonra mesaj kuyruğuna gönder
- Eğer kuyruğa gönderilmezse, retry mekanizması ile tekrar dener
Outbox Tablosu:
ID | Event Name | Payload | Processed | CreatedAt |
---|---|---|---|---|
1 | OrderCreated | {OrderId:1} | false | 2025-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önetimi | Retry Policy |
Performans | Event Batching |
Hangisini Seçmeliyim?
Özellik | RabbitMQ | Kafka | Azure Service Bus |
---|---|---|---|
Cloud Native | ❌ | ❌ | ✅ |
Yüksek Hacim | ❌ | ✅ | ✅ |
Transactional | ✅ | ❌ | ✅ |
Kolay Kurulum | ✅ | ❌ | ✅ |
🎯 Senin Proje Yapın İçin Önerim
Servis | Event Broker | Pattern |
---|---|---|
Dosya Yükleme | Azure Service Bus | Choreography |
E-Mail Bildirimi | Azure Service Bus | Choreography |
Stok Güncelleme | Azure Service Bus | Choreography |
Loglama | Azure Blob | Outbox |
Sonuç
✅ Veri Senkronizasyonu
✅ Asenkron Çalışma
✅ Ölçeklenebilirlik
✅ Hata Toleransı