Saga-pattern we paýlanan amallar
Saga-pattern we paýlanan amallar
1) Näme üçin saga gerek?
Klassiki 2PC (iki fazaly fiksasiýa) pes ulalýar, şowsuzlyklara esaslanýar we çeşmeleri bloklaýar. Saga umumy iş prosesini lokal amallaryň (ädimleriň) yzygiderliligine bölýär, olaryň her biri özbaşdak birleşýär. Şowsuzlyk ýüze çykan halatynda indiki ädimler ýatyrylýar, eýýäm ýerine ýetirilenler bolsa ters amallar bilen öwezini dolýar.
Netije: global päsgelçiliksiz dolandyrylýan eventual consistency, ýokary diri galmak we anyk dikeldiş teswirnamasy.
2) Esasy modeller
2. 1 Orkestr
Saýlanan dastan koordinatory ädimleri dolandyrýar: buýruklar iberýär, jogaplara/wakalara garaşýar, öwezini dolmaga başlaýar.
Artykmaçlyklary: merkezleşdirilen gözegçilik, ýönekeý syn etmek, anyk möhletler. Minuslar: goşmaça komponent.
2. 2 Horeografiýa
Koordinator ýok; Hyzmatlar biri-biriniň wakalaryna reaksiýa bildirýärler ("OrderPlaced" → "PaymentCaptured" → "InventoryReserved"...).
Plýuslar: gowşak baglanyşyk. Minuslar: yzarlamak has kyn, anyk düzgünler bolmazdan "ölüm tansynyň" töwekgelçiligi.
2. 3 TCC (Try-Confirm/Cancel)
Çeşmeleri "doňdurmak" warianty:1. Try - taýýarlyk/ätiýaçlyk,
2. Confirm - düzediş,
3. Cancel - yza çekilýär.
Kepillikler has ýokary, ýöne ätiýaçlyklaryň şertnamalary we wagtlary has kyn.
3) Ädimleriň we öwezini dolmagyň şertnamalary
Her ädim = ýerli geleşik + kompensasiýa (idempotent, gaýtalamaga rugsat berýär).
Kompensasiýa doly "dünýäni yzyna gaýtarmaga" borçly däldir - domen ekwiwalentligi ýeterlikdir (mysal üçin, "tölegi aýyrmagyň" ýerine "yzyna gaýtarmak").
Inwariantlary kesgitläň: pul üçin - balans minusa gitmeýär; sargytlar üçin - "asylan" statuslar ýok.
Möhleti geçen synanyşyklar üçin/TTL ätiýaçlyk möhletlerini we "garbage collector" belläň.
4) Eltmegiň utgaşdyrylmagy we semantikasy
Habar ibermek: at-least-once (defolt) → ähli amallar idempotent bolmaly.
Tertip: korrelýasiýa açary boýunça möhümdir (mysal üçin 'order _ id', 'player _ id').
Exactly-once - saga maksady däl; idempotent açarlary, outbox/inbox we dogry kommitasiýa arkaly netijeli tekiz-bir gezek gazanýarys.
5) Saga ýagdaýy we onuň log
Näme saklamaly:- 'saga _ id', 'correlation _ id', häzirki ýagdaýy (Running/Completed/Compensating/Compensated/Failed),
- ädim we onuň üýtgeýjileri (tölegleriň/ätiýaçlyklaryň şahsyýetnamalary),
- wakalaryň/kararlaryň taryhy (magazineurnaly), wagtlar, möhletler, retraýlaryň sany.
- Koordinata elýeterli aýratyn Saga Store (tablisa/resminama).
- Koreografiýa üçin - umumy topikde status wakalaryny çap edýän saga ýerli "agentleri".
6) Ygtybarly çap edilen nusgalar: outbox/inbox
Outbox: ädim üýtgeşmeleri jemleýär we wakany/buýrugy bir amalda outbox tablisasyna ýazýar; worker tekerde çap edýär.
Inbox: Sarp ediji işlenilen 'message _ id' → dedup + idempotentlik tablisasyny ýöredýär.
Üstünlikli täsirinden soň, kommitim offset/ACK (Kafka/RabbitMQ) - has ir däl.
7) Saga ädimleriniň dizaýny
7. 1 Mysal (iGaming/e-commerce arkaly satyn almak)
1. PlaceOrder → 'PENDING' statusy.
2. AuthorizePayment (Try) → `payment_hold_id`.
3. ReserveInventory → `reservation_id`.
4. CapturePayment (Confirm).
5. FinalizeOrder → `COMPLETED`.
- (3) şowsuz bolsa → 'CancelPaymentHold';
- eger (4) (3) → 'ReleaseInventory' -den soň şowsuz bolsa;
- (5) şowsuz bolsa → 'RefundPayment' we 'ReleaseInventory'.
7. 2 Möhletler/retralar
Eksponensial gijikdirme bilen iň köp N retraew + jitter.
Geçenden soň - "Compensating" -e geçiň.
Her ädim üçin next_attempt_at we deadline_at saklaň.
8) Orkestrator vs platforma
Wariantlar:- Ýeňil öý orkestratory (mikroservis + Saga tablisasy).
- Platformalar: Temporal/Cadence, Camunda, Netflix Conductor, Zeebe - taýmerler, retralar, uzak ömürli iş ýerleri, görünmek we web konsol berýär.
- Horeografiýa üçin wakalaryň katalogyny we statuslar/açarlar baradaky berk şertnamany ulanyň.
9) Integrasiýa teswirnamalary
9. 1 Asinkron (Kafka/RabbitMQ)
Buýruklar: 'payments. authorize. v1`, `inventory. reserve. v1`.
Wakalar: 'payments. authorized. v1`, `inventory. reserved. v1`, `payments. captured. v1`, `payments. refunded. v1`.
Partiýa açary = 'order _ id '/' player _ id'.
9. 2 Ädimiň içinde sinhron (HTTP/gRPC)
"Gysga" ädimler üçin kabul ederliklidir, ýöne hemişe wagt/retraut/idempotentlik we asinxron öwezini dolmak üçin fallback bilen.
10) Idempotentlik we açarlar
Buýruklaryň we öwezini dolmagyň soraglarynda 'idempotency _ key' -ni beriň.
Zyýanly täsirleri (DB-e ýazmak/hasapdan çykarmak) şertli ýerine ýetirilýär: "Eger 'idempotency _ key' entek görülmedik bolsa, ýerine ýetirmek".
Öwezini dolmak hem idempotentdir: 'RefundPayment (id = X)' gaýtalamak howpsuz.
11) Ýalňyşlyklary gaýtadan işlemek
Synplar:- Transient (torlar/wagtlar) → retrailer/backoff.
- Business (ýeterlik serişdeler, çäkler) → derrew öwezini dolmak/alternatiw ýol.
- Irrecoverable (üýtgemezlik) → el bilen gatyşmak, "el bilen" öwezini dolmak.
- Karar matrisini düzüň: ýalňyşlyk görnüşi → hereket (retry/compensate/escalate).
12) Syn etmek we SLO sagy
SLI/SLO:- End-to-end latency saga (p50/p95/p99).
- Success rate (öwezini dolmazdan tamamlananlaryň paýy).
- Mean time to compensate и compensation rate.
- Orphaned sagas (asylan) we GC çenli wagt.
- Trace: 'trace _ id '/' saga _ id' ädimleriň arasynda span link hökmünde; ýalňyşlyk býudjetleri üçin burn-rate metrikleri.
Logi: saga statusynyň her üýtgemegi = sebäpli gurluşly ýazgy.
13) Mysallar (ýalan resminama)
13. 1 Orkestrator (ideýa)
python def handle(OrderPlaced e):
saga = Saga. start(e. order_id)
saga. run(step=authorize_payment, compensate=cancel_payment)
saga. run(step=reserve_inventory, compensate=release_inventory)
saga. run(step=capture_payment, compensate=refund_payment)
saga. run(step=finalize_order, compensate=refund_and_release)
saga. complete()
def run(step, compensate):
try:
step () # local transaction + outbox except Transient:
schedule_retry()
except Business as err:
start_compensation(err)
13. 2 Outbox (tablisanyň pikiri)
outbox(id PK, aggregate_id, event_type, payload, created_at, sent_at NULL)
inbox(message_id PK, processed_at, status)
saga(order_id PK, state, step, next_attempt_at, deadline_at, context JSONB)
saga_log(id PK, order_id, time, event, details)
13. 3 Horeografiýa (mowzuklaryň pikirleri)
`orders. placed '→ sarp edijiler: ' payments. authorize`, `inventory. reserve`
`payments. authorized` + `inventory. reserved` → `orders. try_finalize`
Islendik ret → 'orders. compensate '→ başlanýar' payments. cancel/refund`, `inventory. release`.
14) 2PC we ES bilen deňeşdirme
2PC: güýçli sazlaşyk, ýöne gulplama, dar ýerler, "mis turbalar".
Saga: eventual consistency, kompensasiýa we telemetriýa düzgüni gerek.
"Event Sourcing": wakalary hakykat çeşmesi hökmünde saklaýar; onuň üstündäki saglar tebigy, ýöne migrasiýa/snapshotlaryň çylşyrymlylygyny goşýar.
15) Howpsuzlyk we gabat gelmek
Transportyň gizlinligi (TLS/mTLS), ACL per topic/queue.
Wakalarda - iň az PII, duýgur meýdanlary şifrlemek, tokenizasiýa.
Kompensasiýa saglaryna we žurnallaryna girmegiň barlagy.
Daşarky üpjün edijiler bilen SLA (tölegler/eltip bermek) = möhletleriň we retraýlaryň çäkleriniň parametrleri.
16) Giriş çek-sanawy (0-45 gün)
0-10 gün
Dalaşgärleri saýlaň (multiservis, öwezini dolmak bilen).
Model (orkestr/horeografiýa/TSS) we korelýasiýa açaryny saýlaň.
Ädimleri/öwezini dolmalary, üýtgewsizlikleri we möhletleri beýan ediň. "saga", "outbox", "inbox" tablisalaryny galdyryň.
11-25 gün
Outbox/inbox, idempotent we backoff retrailerini açyň.
Ilkinji saga goýuň; SLI/SLO dashbordlaryny we yzarlamalaryny goşuň.
Runbook öwezini dolmak (şol sanda el bilen) we eskalasiýa ýazyň.
26-45 gün
GC "asylan" saglary, wagtal-wagtal täzeden başlamagy/dowam etmegi awtomatlaşdyryň.
Oýun-day geçiriň: ädimiň şowsuzlygy, möhletiň geçmegi, dellalyň elýeterliligi.
Wakalaryň şertnamalaryny (wersiýalary, laýyklyk) standartlaşdyryň, "sag katalogyny" açyň.
17) Anti-patternler
Domen dogry ters hereketiniň ýerine "kompensasiýa = DB-den delete".
Ýok outbox/inbox → hadysalaryň ýitmegi/goşa effektler.
Jittersiz retraýlar → öz-DDoS endikleri.
Okamakda "gaýtadan işlemek" bolmazdan güýçli sazlaşyga garaşmak....
Hemme zat üçin bir ullakan orkestrator → dolandyryş monolit.
Görünmezlik we SLA → dolandyrylmaýan tans.
Möhletleri äsgermezlik etmek → baky ätiýaçlyklar/holdlar.
18) Kämillik ölçegleri
≥ prosesleriň 90% -i saga/kompensasiýa bilen örtülendir we beýan edilen üýtgemeleri bar.
Outbox/inbox ähli öndürijiler/konsumerler üçin birleşdirildi Tier-0/1.
SLO: p95 end-to-end sagy kadaly, success rate durnukly, orphaned <maksat.
Aç-açan ýol we "ädimler boýunça" daşbordlar, burn-rate alert.
Çärýeklik game-day we el runbook-kompensasiýalaryny barlamak.
19) Netijenama
Saga - paýlanan ulgamlar üçin amaly ylalaşyklyk şertnamasy: anyk ädimler we ters hereketler, neşiriň tertibi (outbox/inbox), möhletler we retralar, gözegçilik etmek we öwezini dolmak prosesleri. Modeli saýlaň (orkestr/horeografiýa/TSS), inwariantlary we açarlary belläň, prosessorlary idempotent ediň - multiservis iş prosesleriňiz gymmat bahaly 2PC bolmazdan öňünden aýdyp boljak we durnukly bolar.