Mikroservislerde dağıtık transaction nasıl yönetilir? 2PC ve Saga pattern'i karşılaştırın.

Cevap

Her servisin kendi veritabanı olduğunda, birden fazla servise yayılan bir işlemi (sipariş oluştur, ödeme al, stok düş) tek bir ACID transaction ile yapamazsınız. İki temel yaklaşım vardır.

Two-Phase Commit (2PC)

Bir koordinatör tüm katılımcılara önce "hazır mısın?" (prepare) sorar; hepsi evet derse "commit", biri hayır derse "rollback" gönderir.

  • Artı: güçlü tutarlılık (atomiklik).
  • Eksi: katılımcılar karar gelene kadar kilitleri tutar; koordinatör çökerse sistem bloklanır; gecikme ve erişilebilirlik kötüleşir. Kafka, çoğu NoSQL ve dış API'ler 2PC desteklemez.
  • Sonuç: mikroservislerde nadiren kullanılır.

Saga pattern

Büyük işlem, her biri kendi lokal transaction'ı olan adımlara bölünür. Bir adım başarısız olursa önceki adımların etkisini geri alan telafi edici işlemler (compensating transactions) çalıştırılır.

1. Order Service    : siparişi PENDING oluştur     | telafi: siparişi CANCELLED yap
2. Payment Service  : ödemeyi al                   | telafi: iade et
3. Inventory Service: stok düş  -> BAŞARISIZ
   => Payment iade edilir, Order CANCELLED olur

İki koordinasyon şekli:

ChoreographyOrchestration
NasılHer servis olay yayınlar, diğerleri dinleyip tepki verirMerkezi bir orchestrator adımları sırayla komut olarak gönderir
ArtıMerkezi bağımlılık yok, gevşek bağlıAkış tek yerde görünür, test ve hata yönetimi kolay
EksiAkışı takip etmek zorlaşır, döngüsel bağımlılık riskiOrchestrator'a mantık yığılabilir
Uygun2-4 adımlı basit akışlarKarmaşık, çok adımlı iş süreçleri

Orchestration için Temporal, Camunda, AWS Step Functions gibi araçlar kullanılır.

Saga'nın zorlukları

  • İzolasyon yoktur: ara durumlar diğer işlemler tarafından görülebilir (ör. ödeme alındı ama sipariş henüz onaylanmadı). Çözüm: PENDING gibi semantik kilit durumları.
  • Telafi her zaman tam geri alma değildir: gönderilmiş e-posta geri alınamaz, yerine "iptal bildirimi" gönderilir.
  • Her adım ve telafi idempotent olmalı, çünkü mesajlar tekrar gelebilir.
  • Olay yayınlama ile DB yazmasının atomik olması için genellikle transactional outbox ile birlikte kullanılır.
  1. Mesaj kuyruğu (RabbitMQ, Kafka) ne zaman kullanılır?ZorSistem TasarımıBackend
  2. Monolith ile mikroservis mimarisi arasındaki fark nedir? Mikroservislere ne zaman geçilmeli?ZorSistem TasarımıBackend
  3. CAP teoremi nedir? Gerçek sistemlerde nasıl yorumlanır?ZorSistem TasarımıBackend
  4. Dikey ve yatay ölçekleme arasındaki fark nedir?KolaySistem TasarımıFull Stack
  5. Hangi cache stratejilerini biliyorsunuz?OrtaSistem TasarımıFull Stack
  6. REST ile GraphQL arasındaki farklar nelerdir?OrtaSistem TasarımıFull Stack

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle