Microservice — Saga Deseni: Dağıtık Sistemlerde İşlem Yönetiminin Sırrı

Cenker Kumlucalı
2 min readAug 18, 2023

--

Dağıtık sistemlerde işlem yönetimi her zaman bir baş ağrısı olmuştur. Geleneksel monolitik sistemlerde tek bir veritabanı üzerinde işlem yaparken, mikroservis mimarilerinde farklı servislerle iletişim halinde olabilirsiniz. İşte tam da bu noktada Saga deseni devreye giriyor.

Saga’nın Temel Felsefesi:

Saga, bir işlemin birden çok servis arasında nasıl koordine edileceğini tanımlayan bir desendir. Bir adımda hata meydana gelirse, hata geri alınamaz. Ancak, bu hatayı telafi etmek için kompanze edici işlemler tetiklenebilir.

Neden Saga Deseni?

  1. Dağıtık İşlemlerin Kolaylaştırılması: Saga, dağıtık işlemleri yönetmek için basit ve etkili bir yaklaşım sunar.
  2. Hata Yönetimi: Saga, bir adımda bir hata meydana geldiğinde ne olacağını tanımlar. Bu, potansiyel hatalar için plan yapmayı kolaylaştırır.
  3. Esneklik: Saga deseni, servisler arasında esnek bir iletişim oluşturur. Bu, sistemdeki değişikliklere hızla adapte olmanızı sağlar.

Saga’nın Zorlukları:

  1. Komplekslik: Dağıtık bir ortamda, tüm servislerin durumunu ve işlemleri izlemek zor olabilir.
  2. Sonunda Tutarlılık: Saga, anında konsistans yerine sonunda tutarlılık (eventual consistency) ilkesine dayanır. Bu, bazı durumlarda geçici veri tutarsızlıkları olabileceği anlamına gelir.
  3. Hata Yönetimi: Potansiyel her hataya karşılık gelen bir kompanze edici işlem tanımlanması gerekmektedir.

Örnek: E-Ticaret Sistemi

Bir e-ticaret sistemi düşünün. Müşteri bir ürün satın almak istediğinde, öncelikle ödeme işlenir, ardından stok kontrol edilir ve son olarak sipariş teslim edilir.

Senaryo: Ödeme başarılı oldu, ancak ürün stokta kalmadı.

public class OrderService 
{
public event Action<Order> OnOrderFailed;

public void ProcessOrder(Order order)
{
bool paymentResult = PaymentService.Charge(order);
bool stockResult = StockService.CheckStock(order.Product);

if (paymentResult && !stockResult)
{
PaymentService.Refund(order);
OnOrderFailed?.Invoke(order);
}
}
}

// Başka bir serviste
public class NotificationService
{
public NotificationService(OrderService orderService)
{
orderService.OnOrderFailed += SendOutOfStockNotification;
}

private void SendOutOfStockNotification(Order order)
{
// Müşteriye stokta olmadığına dair bir bildirim gönder
}
}

Bu örnekte, ödeme başarılı bir şekilde işlendi ancak ürün stokta yok. Bu durumda, ödeme geri ödenir ve müşteriye bir bildirim gönderilir.

Sonuç:

Saga deseni, mikroservis mimarilerinde işlem yönetimi için güçlü bir araçtır. Bu yaklaşım, dağıtık sistemlerin karmaşıklığına rağmen işlemlerin sorunsuz bir şekilde tamamlanmasını sağlar.

--

--

No responses yet