Sagalar ve dağıtılmış işlemler
Bir saga, farklı hizmetler/depolar arasında bir dizi yerel adıma bölünmüş uzun vadeli bir ticari işlemdir. Her adımın, kısmi başarısızlıktaki adım etkisini geri alan telafi edici bir eylemi vardır. 2PC/3PC aksine, sagalar küresel kilitleri tutmaz ve nihai tutarlılığın kabul edilebilir olduğu mikro hizmetler, çok bölgeler ve yüksek yükler için uygundur.
1) Ne zaman destan seçilir (ve ne zaman değil)
Sığdır:- Uzun/çok adımlı iş süreçleri (sipariş - ödeme - rezerv - teslimat).
- Ortak bir işlemin olmadığı farklı alanlar ve depolar.
- Yüksek kullanılabilirlik ve ölçeklendirme gerekir.
- Katı asit atomisitesi kritiktir (örneğin, aynı kayıt defteri içinde büyük miktarların aktarılması).
- Net bir telafi edilebilirlik yoktur (efekti "rezerve" edemez veya iptal edemezsiniz).
- Yasal/düzenleyici kısıtlamalar sıkı bir izolasyon ve "anlık'bir değişmez gerektirir.
2) Sagas modelleri
1. Saga Orchestrator - Merkezi koordinatör adımları ve tazminatları yönetir.
Artıları: açık akış, hata kontrolü, basitleştirilmiş telemetri.
Eksileri: merkezileşme noktası, "yağ" koordinatörü riski.
2. Koreografi (Koreografi): merkez yok - adımlar olaylar tarafından başlatılır ("servis A X yaptı" servis B tepki verir ").
Artıları: zayıf bağlantı, basit ölçeklendirme.
Eksileri: Akışı, kuralların "yayılma" riskini izlemek/hata ayıklamak daha zordur.
3. TTK (Dene-Onayla/İptal Et) - Her adım "Dene'dir, sonra Onayla veya İptal Et.
Artıları: sözde iki fazlı protokol, yönetilen kaynaklara daha yakın.
Eksileri: arayüzlerin uygulanmasında daha pahalı; "Try" tutucu zaman aşımları gerektirir.
3) Pitch ve tazminat tasarımı
Değişmezler: adımdan önce/sonra neyin doğru olması gerektiğini açıkça belirtir (örneğin, "kalan ≥ 0").
Ters işlem ≠ tazminat: Bu, iş etkisini iptal eden mantıklı bir eylemdir (geri ödeme, serbest bırakma, geri yükleme).
İdempotans: hem adım hem de kompansatör güvenli bir şekilde tekrarlanmalıdır ('operation _ id'ile).
Zaman aşımları: her adımın bir son tarihi vardır; gecikme tazminatı tetikler.
Geri dönüşü olmayan etkiler: bunları ayrı ayrı kaydedin (bildirimler, e-posta) ve'en iyi çabaya "izin verin.
4) Tutarlılık ve düzen
Nihai tutarlılık: kullanıcılar zaman tutarsızlıklarını görebilir; UX - "bekle "/döndürücüler/durumlarla.
Anahtarla sipariş - Olayları sipariş etmek için anahtarlama adımlarını iş anahtarına (order_id) göre gruplayın.
Veri tekilleştirme - İşlem günlüğünü ('operation _ id' - durum) TTL ile saklayın.
5) Ulaşım ve güvenilirlik
Giden kutusu deseni-Olayı aynı işlem içindeki yerel giden kutusu tablosuna yazar ve ardından eşzamansız olarak veri yoluna yayınlar.
Gelen kutusu/Idempotency deposu: tüketici tarafında - zaten işlenmiş mesajların bir günlüğü.
Tam olarak bir kez etkili: "outbox + idempotent tüketici" pratik bir "tam olarak bir kez" verir.
DLQ: Zengin meta-bilgi ve güvenli redrive içeren "zehirli" mesajlar için.
6) Hata, yeniden ödeme, geri alma ilkeleri
Sadece idempotent adımları tekrarlıyoruz; yazma işlemleri - 'Idempotency-Key'ile.
Üstel geri dönüş + jitter; Sınırlayıcı girişimler ve destanın özet son tarihi.
Sistemik bozulma ile - Devre Kesici ve zarif bozulma (örneğin, destanın ikincil kurgu kısmını iptal edin).
İş çatışmaları ('409') - uzlaşma veya telafi ve sona erdikten sonra yeniden deneyin.
7) Orkestratör: Sorumluluklar ve Yapı
Fonksiyonlar:- Destanın durumunu takip etmek: 'Pending - RUNNING - COMPENSATING - DONE/FAILED'.
- Planlama adımları, son tarihler, zaman aşımları, geri çekilmeler.
- Olay yönlendirme ve dengeleme başlatılıyor.
- Koordinatör operasyonlarının idempotensi (komut günlüğü).
- Gözlemlenebilirlik: Günlüklerde/izlerde/metriklerde 'saga _ id' korelasyonu.
- Tablolar 'saga', 'saga _ step', 'komutlar', 'giden kutusu'.
- 'saga _ id', 'business _ key', 'status', 'next _ run _ at' dizinleri.
8) Koreografi: "Kartopu'na karşı kurallar ve koruma
Etkinlik sözleşmeleri: şemalar ve sürüm oluşturma (Avro/Proto/JSON Schema).
Açık semantik:'olay gerçeği "vs" komut ".
Zinciri durdurma: hizmet, bir uyumsuzluk tespit ettikten sonra, bir 'Başarısız'/' Telafi Et' olayı yayınlar.
"Sonsuz döngülerde" alarmlar ve uyarılar.
9) TCC: pratik detaylar
Dene: TTL ile kaynak rezervi.
Onayla: taahhüt et, geçici kilitleri bırak.
İptal: Yedek geri alma (yan etkileri olmadan).
Çöp toplama: TTL'den sonra Try'ın otomatik olarak iptal edilmesi (idempotent Cancel).
Onayla/İptal et idempotent: tekrar güvenlidir.
10) Örnek (kelime şeması) - "Ödeme ve teslimat ile sipariş"
1. CreateOrder (yerel) - giden kutusu: 'OrderCreated'.
2. PaymentService: 'Try' rezervi (TCC); Eğer 'PaymentReserved' gönderilirse, eğer 'PaymentFailed' başarısız olursa.
3. EnvanterHizmet: ürün rezervi; Out of "InventoryFailed" (Envanter başarısız oldu).
4. ShippingService - Teslimat yuvası oluşturun (iptal edilebilir).
5. Eğer herhangi bir 'Failed' basamağı> orkestratör telafileri ters sırada başlatır: 'CancelShipping' - 'ReleaseInventory' - 'PaymentCancel'.
6. Eğer her şey yolundaysa - 'PaymentConfirm' - 'OrderConfirmed'.
11) Orkestratör pseudocode
pseudo startSaga(saga_id, order_id):
steps = [ReservePayment, ReserveInventory, BookShipment, ConfirmPayment]
for step in steps:
res = execWithRetry(step, order_id)
if!res.ok:
compensateInReverse(steps_done(order_id))
return FAIL return OK
execWithRetry(step, key):
for attempt in 1..MAX:
try:
return step.run(key) # идемпотентно catch RetryableError:
sleep(backoff(attempt))
catch NonRetryableError:
return FAIL return FAIL
compensateInReverse(done_steps):
for step in reverse(done_steps):
step.compensate() # идемпотентно
12) Gözlemlenebilirlik ve operasyonel SLO'lar
İzleme: tek 'saga _ id', ek açıklamalar 'adım', 'girişim', 'karar' (çalıştır/telafi et/atla).
Metrikler:- Sagaların başarısı/hatası (%), ortalama süre, p95/p99.
- Telafi edilen destanların payı, tazminat için en önemli nedenler.
- Kuyruklar/giden kutusu gecikir, adımlarda geri çekilir.
- Günlükler/denetimler: orkestratör çözümleri, kaynak tanımlayıcıları, iş anahtarları.
13) Test ve kaos
Her adıma hata enjekte etme: zaman aşımları, '5xx', iş çatışmaları.
Sıra dışı olaylar, kopyalar, düşüşler.
Uzun gecikme kuyrukları - son teslim tarihlerini ve tazminatları kontrol etmek.
Kitle sagaları - WFQ/DRR'yi ve kuyruklardaki kapakları kontrol etmek, "satır başı engelleme'nin olmaması.
DLQ'dan adım adım ve bütün bir destanda redrave.
14) Çok kiracılık, bölgeler, uyumluluk
Etiketler 'tenant _ id/plan/region' olaylar ve saga depolarında.
İkamet: Veriler/etkinlikler bölgeyi terk etmez; Bölgeler arası destanlar, yerel sagaların + toplama olaylarının federasyonları olarak tasarlanmıştır.
Önceliklendirme: VIP sagaları daha fazla kota ağırlığı taşır; kiracı başına işçi izolasyonu.
15) Satış öncesi kontrol listesi
- Her adımın net bir kompansatörü vardır, her ikisi de idempotenttir.
- Şablon seçildi: orkestrasyon/koreografi/TSS; Sorumluluk sınırları tanımlanmıştır.
- Giden kutusu/Gelen kutusu uygulandı, 'operation _ id'ile veri tekilleştirme.
- Retray politikaları: jitter ile geri dönüş, sınırları ve genel destan son tarihini deneyin.
- Olay sözleşmeleri sürümlüdür, planın doğrulanması vardır.
- DLQ ve Secure Release yapılandırılmıştır.
- Telemetri: metrikler, izleme, korelasyon 'saga _ id'.
- Operasyonel oyun kitapları: manuel iptal/zorla onaylama, "asılı" destanların kilidini açma.
- Kaos ve yük testleri geçer, SLO/hata bütçesi tanımlanır.
16) Tipik hatalar
Kompansatör yoktur veya "kirli'dir (yan etkileri vardır).
Hiçbir idempotence/dedup yoktur - devletlerin çiftleri ve "salınımları".
Açık sınırlar olmadan "Saga in Saga" - döngüler ve karşılıklı kilitler.
Son tarihler yoktur - "ebedi" sagalar ve kaynak sızıntıları.
Orkestratör, durumu sabit bir mağaza olmadan "bellekte" saklar.
Telemetri merkezi olmayan koreografi - "görünmez" başarısızlıklar.
Opak UX: Kullanıcılar ara durumları görmezler.
17) Hızlı tarifler
SaaS klasikleri: orkestrasyon + giden kutusu/gelen kutusu, üstel geri alma, DLQ, UI'de saga durumları.
Güçlü kaynak değişmezleri: TTL rezervli TTK ve GK İptal.
Yüksek hacim/yük: olay koreografisi + sıkı idempotency ve anahtar metrikler.
Çok bölgeli: yerel sagalar + nihai agregalar; global kilitlerden kaçının.
Sonuç
Sagalar, küresel kilitleri olmayan dağıtılmış sistemlerde öngörülebilir tutarlılık elde etmenin bir yoludur. Net kompansatörler, idempotans, güvenilir teslimat (giden/gelen kutusu), zaman aşımı ve yeniden ödeme disiplini, ayrıca telemetri ve oyun kitapları, karmaşık iş süreçlerinin artan yük, hizmet sayısı ve coğrafyalarla istikrarlı ve okunabilir kalmasını sağlamanın anahtarıdır.