Saga Deseni
- İngilizcesi
- Saga Pattern
- Okunuşu
- saga petırn
Kısaca
Saga deseni, birkaç servise yayılan bir işlemi yerel adımlar dizisi olarak çalıştırır ve bir adım başarısız olursa tamamlananları telafi eylemleriyle geri alır.
Saga deseni nedir?
Bir mikroservis sisteminde her servisin genellikle kendi veritabanı vardır; bu yüzden sipariş vermek gibi tek bir iş eylemi birkaç servisteki veriyi güncellemeyi gerektirebilir. Normal bir veritabanı işlemi (transaction) hepsini kapsayamaz ve iki aşamalı commit (two-phase commit) gibi dağıtık kilitleme protokolleri ölçekte yavaş ve kırılgandır. Saga deseni, eylemi her servis için bir tane olmak üzere, her biri kendi başına commit edilen bir yerel işlemler dizisine bölerek bunu çözer.
Her adım başarılı olursa saga tamamlanır. Bir adım başarısız olursa saga, halihazırda biten adımlar için, etkilerini geri almak üzere, ayrılmış stoku serbest bırakmak ya da ödemeyi iade etmek gibi telafi edici işlemleri (compensating transactions) ters sırayla çalıştırır. Bir saga iki şekilde koordine edilebilir: orkestrasyonda merkezi bir orkestratör her servise sıradaki adımı söyler; koreografide ise her servis diğerlerinden gelen olayları dinler ve merkezi bir denetleyici olmadan tepki verir. Mesajlar birden fazla kez iletilebileceği için her adım ve telafi idempotent olmalıdır.
Klasik benzetme bir seyahat rezervasyonudur. Önce uçak, sonra otel, sonra kiralık araba ayırtırsınız; araba bulunmazsa tüm seyahat hiç olmamış gibi davranmak yerine oteli ve uçağı iptal edersiniz. Sagalar sipariş işlemede, ödemelerde, seyahat ve bilet rezervasyonunda ve servis sınırlarını aşan her iş akışında kullanılır; fikir, uzun ömürlü işlemler üzerine 1987 tarihli bir veritabanı makalesine dayanır.
Saga çoğunlukla bir ACID işlemiyle karıştırılır ama daha zayıf garantiler sunar. İzolasyon yoktur: diğer istekler, ödenmiş ama henüz onaylanmamış bir sipariş gibi ara durumları görebilir; bu yüzden sistem anında değil, nihai olarak tutarlıdır. Telafi de gerçek bir geri alma (rollback) değildir; yeni bir iş eylemidir ve gönderilmiş bir e-posta ya da çekilmiş bir kart yalnızca düzeltilebilir, silinemez.
Önemli noktalar
- Saga, servisler arası bir işlemi bağımsız commit edilen yerel adımlara böler.
- Bir adım başarısız olursa telafi edici işlemler önceki adımları ters sırayla geri alır.
- Orkestrasyon merkezi bir koordinatör kullanır; koreografi servisler arasındaki olayları kullanır.
- Sagalar nihai tutarlılık sağlar, ACID işleminin izolasyonunu değil.
- Mesajlar tekrarlanabileceği için adımlar ve telafiler idempotent olmalıdır.
Örnek
// Orchestrated saga: run each step, and undo finished steps if one fails
const steps = [
{ run: () => orders.create(order), undo: () => orders.cancel(order.id) },
{ run: () => payments.charge(order), undo: () => payments.refund(order.id) },
{ run: () => stock.reserve(order), undo: () => stock.release(order.id) },
];
async function placeOrder() {
const done: typeof steps = [];
try {
for (const step of steps) { await step.run(); done.push(step); }
} catch (err) {
for (const step of done.reverse()) await step.undo(); // compensate in reverse
throw err;
}
}Sık sorulan sorular
Sagalarda orkestrasyon ile koreografi arasındaki fark nedir?
Orkestrasyonda merkezi bir orkestratör sıradaki adımın hangisi olacağına karar verir ve her servisi çağırır. Koreografide servisler olayları yayınlar ve dinler, her biri belirli bir olay geldiğinde ne yapacağını bilir; bu, merkezi bir koordinatörü ortadan kaldırır ama genel akışı takip etmeyi zorlaştırır.
Telafi edici işlem (compensating transaction) nedir?
Telafi edici işlem, bir ödemeyi iade etmek ya da ayrılmış stoku serbest bırakmak gibi daha önceki bir adımın iş etkisini geri alan eylemdir. Geçmişi silmez; eskisini iptal eden yeni bir değişiklik kaydeder.
Neden saga yerine iki aşamalı commit kullanılmıyor?
İki aşamalı commit, hepsi anlaşana kadar katılan her veritabanındaki kaynakları kilitler; bu da erişilebilirliği ve performansı olumsuz etkiler ve birçok modern veritabanı ile mesaj aracısı tarafından zayıf desteklenir. Sagalar uzun kilitlerden, daha zayıf tutarlılık pahasına kaçınır.
İlgili sayfalar
- MikroservislerYazılım Mimarisi, s. 24Mikroservisler, bir uygulamanın ağ üzerinden iletişim kuran, küçük ve bağımsız olarak dağıtılabilen servislere bölündüğü bir mimari tarzdır.
- TransactionVeritabanları, s. 36Transaction, tek bir bütün olarak başarılı ya da başarısız olan veritabanı işlemleri grubudur; böylece veri asla yarım kalmış, tutarsız bir durumda bırakılmaz.
- Nihai TutarlılıkVeritabanları, s. 20Nihai tutarlılık, yeni güncelleme yapılmazsa dağıtık bir sistemdeki bir verinin tüm kopyalarının zamanla özdeş hale geleceğine dair bir garantidir.
- Olay Güdümlü MimariYazılım Mimarisi, s. 29Olay güdümlü mimari, servislerin bir siparişin verilmesi gibi olaylar üreterek ve bunlara tepki vererek iletişim kurduğu bir yazılım tasarım tarzıdır.
- IdempotencyBackend ve API'ler, s. 23Idempotency, bir işlemin bir kez de çalışsa çok kez de çalışsa aynı sonucu üretmesi özelliğidir; böylece bir isteğin yanlışlıkla tekrarlanması güvenli olur.
- ACIDVeritabanları, s. 1ACID; atomiklik, tutarlılık, yalıtım ve dayanıklılıktan oluşan, hata ya da çökme olsa bile veritabanı transaction'larını güvenilir tutan dört garantidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin