GH GambleHub

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.
Nirede saklanmaly:
  • 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`.

Öwezini dolmak:
  • (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.

Contact

Biziň bilen habarlaşyň

Islendik sorag ýa-da goldaw boýunça bize ýazyp bilersiňiz.Biz hemişe kömek etmäge taýýar.

Integrasiýany başlamak

Email — hökmany. Telegram ýa-da WhatsApp — islege görä.

Adyňyz obýýektiw däl / islege görä
Email obýýektiw däl / islege görä
Tema obýýektiw däl / islege görä
Habar obýýektiw däl / islege görä
Telegram obýýektiw däl / islege görä
@
Eger Telegram görkezen bolsaňyz — Email-den daşary şol ýerden hem jogap bereris.
WhatsApp obýýektiw däl / islege görä
Format: ýurduň kody we belgi (meselem, +993XXXXXXXX).

Düwmäni basmak bilen siz maglumatlaryňyzyň işlenmegine razylyk berýärsiňiz.