2, Mar 2025
Microservice’ler arasında distributed transaction nasıl yönetebiliriz?

Two-Phase Commit (2PC)

Two-Phase Commit (2PC), dağıtık sistemlerde veri tutarlılığı (Data Consistency) sağlamak için kullanılan bir transaction coordination (işlem koordinasyonu) protokolüdür.

Bu protokol, birden fazla mikroservisin veya veritabanının aynı işlemi atomik (Atomic) bir şekilde tamamlamasını sağlar.

Problem Ne?

Dağıtık sistemlerde veri tutarlılığı (Data Consistency) sağlamak oldukça zordur.

Örneğin:

  • OrderService → Siparişi oluşturur
  • PaymentService → Ödeme alır
  • StockService → Stoktan ürün düşer

Bu üç işlem aynı anda başarılı olmalı ya da hiçbiri yapılmamalı. Aksi halde Veri Tutarsızlığı (Data Inconsistency) oluşur.

Çözüm: Two-Phase Commit

2PC, dağıtık işlemleri ya hep ya hiç prensibine göre çalıştırır.


🎯 Nasıl Çalışır?

Two-Phase Commit protokolü iki aşamada çalışır:


1. Prepare (Hazırlık) Aşaması

  • Koordinatör (Coordinator) servisi, tüm katılımcılara (Participants) “İşlemi yapmaya hazır mısın?” diye sorar.
  • Katılımcılar ya:
    • YES (Hazırım) → Hazır olduğunu bildirir.
    • NO (Hazır değilim) → İşlemi yapamayacağını bildirir.

2. Commit (Onaylama) Aşaması

  • Eğer tüm katılımcılar YES dediyse, koordinatör Commit komutu gönderir ve işlemler tamamlanır.
  • Eğer herhangi biri NO derse, koordinatör Rollback komutu gönderir ve tüm işlemler geri alınır.


🔑 Koordinatör Kimdir?

Koordinatör, işlemin yöneticisidir. Dağıtık sistemlerde genellikle:

  • Message Broker (Kafka, RabbitMQ)
  • Database Transaction Manager
  • Custom API Service


📌 Akış Şeması

luaCopyEdit          +-------------------+
          |  Koordinatör      |
          +-------------------+
                 |
                 |
         +-------+-------+
         |               |
    OrderService     PaymentService
         |               |
         |               |
         +-------+-------+
                 |
           StockService


⚙️ Örnek Senaryo

  1. OrderService → Sipariş oluşturuldu (Hazır)
  2. PaymentService → Ödeme alındı (Hazır)
  3. StockService → Stok güncellendi (Hazır)

Hepsi hazırsa: ✅ Commit
Eğer biri başarısızsa:
❌ Rollback



C# .NET Core ile 2PC Örneği


1. OrderService

csharpCopyEditpublic async Task<bool> PrepareOrder(Guid orderId)
{
    Console.WriteLine($"Order {orderId} Hazır");
    return true;
}

2. PaymentService

csharpCopyEditpublic async Task<bool> PreparePayment(Guid orderId)
{
    Console.WriteLine($"Payment {orderId} Alındı");
    return true;
}

3. StockService

csharpCopyEditpublic async Task<bool> PrepareStock(Guid orderId)
{
    Console.WriteLine($"Stock {orderId} Güncellendi");
    return true;
}

4. Koordinatör

csharpCopyEditpublic async Task<bool> TwoPhaseCommit(Guid orderId)
{
    var orderPrepared = await OrderService.PrepareOrder(orderId);
    var paymentPrepared = await PaymentService.PreparePayment(orderId);
    var stockPrepared = await StockService.PrepareStock(orderId);

    if (orderPrepared && paymentPrepared && stockPrepared)
    {
        Console.WriteLine("✅ Commit Edildi");
        return true;
    }
    else
    {
        Console.WriteLine("❌ Rollback Yapıldı");
        return false;
    }
}


💪 Avantajları

ÖzellikAçıklama
Veri TutarlılığıTüm servisler aynı anda tamamlanır
ACID UygunluğuDağıtık sistemlerde ACID prensibi sağlanır
Otomatik RollbackBaşarısız olan işlemler geri alınır


Dezavantajları

ProblemAçıklama
PerformansAğ gecikmeleri nedeniyle yavaş çalışır
TıkanıklıkBir servis kilitlenirse tüm işlem durur
Single Point of FailureKoordinatör çökerse tüm sistem çökebilir


🔥 Alternatif Çözüm: Saga Pattern

Saga Pattern, Two-Phase Commit’e göre daha Asenkron çalışır.

Özellik2PCSaga
Asenkron
PerformansYavaşHızlı
Hata ToleransıDüşükYüksek
Veri TutarlılığıYüksekOrta


Hangi Durumda Hangisi Kullanılır?

DurumÖnerilen Yöntem
Yüksek Veri TutarlılığıTwo-Phase Commit
Performans OdaklıSaga Pattern
Cloud NativeSaga Pattern
Legacy SistemlerTwo-Phase Commit


🔍 Azure Service Bus ile 2PC

Azure Transaction Manager kullanarak Distributed Transactions otomatik olarak yönetilebilir.



🌐 Mimaride Kullanabileceğin Teknolojiler

TeknolojiKullanım
RabbitMQEvent Coordination
KafkaEvent Streaming
Azure Service BusCloud Native Event Coordination
Outbox PatternVeri Tutarlılığı


Sonuç

✅ Veri Tutarlılığı
✅ ACID Uygunluğu
❌ Yavaşlık
❌ Yüksek Karmaşıklık



🎯 Benim Tavsiyem

filesharingsecure projesi için Event-Driven + Saga Pattern + Azure Service Bus kullanman daha performanslı olur.



🚀 Sana Özel Mimari Önerisi

KatmanTeknolojiPattern
Kullanıcı YönetimiAzure Service BusSaga
Dosya PaylaşımıAzure BlobEvent-Driven
BildirimlerAzure QueueOutbox

Eventual Consistency (Zamanla Tutarlılık), dağıtık sistemlerde veri tutarlılığı sağlamak için kullanılan bir veri senkronizasyon stratejisidir.

Bu yaklaşımda anlık (strong consistency) yerine, belirli bir zaman aralığında tüm sistemlerin tutarlı hale gelmesi garanti edilir.



🧠 Neden Eventual Consistency?

Mikroservis mimarilerinde yüksek performans ve ölçeklenebilirlik sağlamak için Asenkron iletişim kullanılır.

Örneğin:

  • Bir sipariş sistemi,
  • Ödeme sistemi,
  • Stok sistemi

Bu sistemler aynı anda çalışmaz. Bunun yerine mesaj kuyruğu (Message Broker) kullanılarak birbirinden bağımsız şekilde veri işler.



💡 Nasıl Çalışır?

Eventual Consistency’de veri şu şekilde senkronize edilir:

  1. İşlem Başlatılır: Bir servis veri günceller.
  2. Event Gönderilir: Güncelleme olayı (Event) mesaj kuyruğuna gönderilir.
  3. Asenkron İşleme: Diğer servisler bu olayı okur ve kendi veri tabanlarını günceller.
  4. Senkronizasyon: Tüm servisler bir süre sonra aynı veriyle tutarlı hale gelir.


🎯 Örnek Senaryo

Bir Dosya Paylaşım Sistemi düşünelim:


Adımlar:

  1. Kullanıcı dosya yükler.
  2. FileService → Dosyayı Azure Blob’a yükler.
  3. Event GönderirFileUploadedEvent
  4. NotificationService → Kullanıcıya e-posta bildirimi gönderir.
  5. AuditService → Log kaydı oluşturur.


Akış Şeması:

rustCopyEdit   Kullanıcı
      |
 FileService ---> FileUploadedEvent ---> NotificationService
      |
      +---------------------> AuditService


Eventual Consistency’nin Avantajları

ÖzellikAçıklama
PerformansServisler Asenkron çalışır
ÖlçeklenebilirlikServisler bağımsız çalışır
Yüksek UygunlukBir servis çökerse diğerleri çalışmaya devam eder


Dezavantajları ❌

ProblemAçıklama
Veri TutarsızlığıKısa süreliğine veri uyumsuz olabilir
KarmaşıklıkEvent-driven mimariler daha karmaşıktır
Hata YönetimiRetry ve Dead Letter Queue mekanizmaları gerekir


Strong Consistency vs Eventual Consistency

ÖzellikStrong ConsistencyEventual Consistency
TutarlılıkAnlıkZamanla
PerformansYavaşHızlı
KarmaşıklıkBasitKarmaşık
Kullanım AlanıFinansal İşlemlerMikroservisler


🔑 Kullanılan Teknolojiler

TeknolojiAçıklama
Azure Service BusEvent Distribution
RabbitMQMessage Broker
KafkaEvent Streaming
Outbox PatternVeri tutarlılığı için


🔥 Örnek Uygulama (.NET Core + Azure)


Event Tanımı

csharpCopyEditpublic class FileUploadedEvent
{
    public Guid FileId { get; set; }
    public string UserEmail { get; set; }
}

FileService (Publisher)

csharpCopyEditpublic async Task UploadFile(File file)
{
    await _blobService.UploadAsync(file);
    
    var @event = new FileUploadedEvent
    {
        FileId = file.Id,
        UserEmail = file.UserEmail
    };

    await _messageBus.PublishAsync(@event);
}

NotificationService (Subscriber)

csharpCopyEditpublic async Task Handle(FileUploadedEvent @event)
{
    Console.WriteLine($"Mail gönderildi: {@event.UserEmail}");
}


🔥 Outbox Pattern ile Eventual Consistency

Outbox Pattern, Eventual Consistency’yi daha güvenilir hale getirir.

👉 Temel mantık şu:

  • İşlem yapıldığında veritabanına önce Event kaydedilir.
  • Daha sonra ayrı bir işlem (Background Job) bu Event’i kuyruğa yollar.


🌐 Azure Mimarisinde Eventual Consistency

  1. Azure Blob Storage → Dosya Yükleme
  2. Azure Service Bus → Event Mesajları
  3. Azure Function → Event İşleyici
  4. Azure CosmosDB → Log Depolama
  5. Azure Application Insights → Telemetri ve İzleme


Sonuç

StratejiAçıklama
Saga Patternİşlem bazında tutarlılık sağlar
2PCACID uyumlu, senkron çalışır
Eventual ConsistencyYüksek Performans, Asenkron


Tavsiye Mimari

KatmanPatternTeknoloji
TransactionSaga PatternAzure Service Bus
Veri TutarlılığıEventual ConsistencyOutbox + Kafka
İşlem KoordinasyonuEvent-DrivenAzure Functions


🎯 filesharingsecure Projesi İçin Mimari Önerisi:

İşlemYöntemTeknoloji
Dosya YüklemeEventual ConsistencyAzure Blob
Kullanıcı BildirimiEvent-DrivenAzure Service Bus
LoglamaOutbox PatternAzure CosmosDB
RetryDead Letter QueueAzure Queue


📌 Senin Projen için YOL HARİTASI

AşamaTeknolojiAçıklama
1. AdımAzure BlobDosya Yükleme
2. AdımAzure Service BusEvent Gönderme
3. AdımAzure CosmosDBLoglama
4. AdımAzure FunctionsRetry & DLQ

1. Two-Phase Commit (2PC)

✅ Tavsiye Durumları:

  • ACID uyumluluğunun kesinlikle zorunlu olduğu yerlerde
  • Bankacılık, finansal işlemler gibi kritik veri tutarlılığı gereken sistemlerde
  • Senkron çalışan servisler arasında

❌ Tavsiye Edilmez:

  • Yüksek trafik ve performans gerektiren sistemlerde
  • Çok sayıda servis arasında (Yavaşlar ve Deadlock riski oluşur)
  • Cloud-Native sistemlerde


🔥 2. Saga Pattern (Asenkron İşlem Koordinasyonu)

✅ Tavsiye Durumları:

  • Mikroservis mimarileri
  • Event-Driven sistemler
  • Azure, AWS gibi Cloud-Native uygulamalar
  • Yüksek ölçeklenebilirlik ihtiyacı olan sistemler
  • Kullanıcı işlemlerinde birden fazla servis zinciri varsa (Dosya Yükleme, Bildirim, Loglama vs.)

Nasıl Çalışır?

Saga Pattern, işlemleri küçük adımlara böler ve her adım tamamlandığında bir Event yayınlar.

👉 Örneğin:

ServisİşlemEvent
FileServiceDosya YüklemeFileUploadedEvent
NotificationServiceMail GönderimiMailSentEvent
AuditServiceLog KaydıLogRecordedEvent

Avantajlar:

ÖzellikAçıklama
PerformansAsenkron, çok hızlı
Fault ToleranceBir servis çökerse diğerleri çalışmaya devam eder
Transaction IsolationServisler birbirinden bağımsız çalışır
ScalabilityCloud Native sistemler için mükemmel

Dezavantajlar:

ProblemÇözüm
Veri TutarsızlığıCompensation Transactions ile Geri Alma
KarmaşıklıkOutbox Pattern + Retry ile kontrol


🔥 3. Eventual Consistency + Outbox Pattern

Bu yaklaşım hem performans hem de veri tutarlılığı açısından en optimum çözüm.

Nasıl Çalışır?

  • İşlem yapılırken önce veritabanına yazılır.
  • Event Outbox tablosuna kaydedilir.
  • Background Job veya Azure Function gibi bir servis Outbox tablosundaki mesajları Message Queue‘ya yollar.

Önerdiğim Mimari

KatmanPatternTeknoloji
TransactionSaga + Eventual ConsistencyAzure Service Bus
Veri TutarlılığıOutbox PatternMSSQL + Azure
RetryDead Letter QueueAzure Queue
BildirimEvent-DrivenAzure Functions


⚙️ Teknoloji Stack:

KatmanTeknolojiAçıklama
Event BrokerAzure Service BusEvent Driven Asenkron
OutboxMSSQL + EF CoreTransaction + Event Tutarlılığı
StorageAzure BlobDosya Yükleme
LoglamaCosmosDBEvent-Driven Loglama
TelemetryAzure Application Insightsİzleme ve Hata Yönetimi


🔥 Peki filesharingsecure için Önerdiğim Mimari:

İşlemYöntemTeknolojiPattern
Dosya YüklemeAsenkron + OutboxAzure BlobEventual Consistency
BildirimEvent-DrivenAzure Service BusSaga Pattern
LoglamaOutbox PatternCosmosDBEventual Consistency
RetryDead Letter QueueAzure QueueEvent-Driven


Neden Bu Mimaride Israrcıyım?

✅ Azure Native
✅ Performans
✅ Asenkron
✅ Otomatik Retry
✅ Eventual Consistency
✅ Dağıtık Transaction



🏆 Tavsiye Sıralaması

YöntemPerformansTutarlılıkKarmaşıklıkÖnerilen Alan
Two-Phase Commit❌ Düşük🔥 %100🔥 BasitFinans, Bankacılık
Saga Pattern🔥 Yüksek%90⚠️ OrtaMikroservisler
Eventual Consistency + Outbox🔥 Çok Yüksek%95⚠️ OrtaCloud Native, Dosya Paylaşımı


Sana Özel Önerim 💪

Senin filesharingsecure projenin iş modelini düşündüğümde sana şu yapıyı öneriyorum:

KatmanYöntemTeknoloji
TransactionEventual Consistency + OutboxMSSQL + EF Core
BildirimEvent-Driven SagaAzure Service Bus
LoglamaOutbox PatternCosmosDB
Dosya DepolamaAzure BlobEventual Consistency
Hata YönetimiRetry + DLQAzure Queue


🚀 YOL HARİTASI:

  1. Azure Blob Storage Dosya Yükleme
  2. MSSQL + Outbox Veri Tutarlılığı
  3. Azure Service Bus Event Gönderimi
  4. Azure CosmosDB Loglama
  5. Azure Functions Retry ve DLQ

Bir yanıt yazın

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