GH GambleHub

Sagi i transakcje rozproszone

Saga to długoterminowa transakcja biznesowa w podziale na sekwencję kroków lokalnych w różnych usługach/repozytoriach. Każdy krok ma działanie kompensacyjne, które cofa efekt kroku w częściowej awarii. W przeciwieństwie do 2PC/3PC, sagi nie posiadają światowych zamków i nadają się do mikroelementów, wielowarstwowych i wysokich obciążeń, gdzie ewentualna konsystencja jest akceptowalna.


1) Kiedy wybrać sagi (a kiedy nie)

Pasuje do:
  • Długie/wieloetapowe procesy biznesowe (zamówienie → płatność → rezerwacja → dostawa).
  • Różne domeny i repozytoria, w których nie ma wspólnej transakcji.
  • Potrzebujesz wysokiej dostępności i skali.
Nie nadaje się:
  • Atomowość kwasu stałego jest krytyczna (na przykład przenoszenie dużych ilości w tym samym rejestrze).
  • Nie ma wyraźnej rekompensaty (nie można „rezerwować” lub anulować efektu).
  • Ograniczenia prawne/regulacyjne wymagają ścisłej izolacji i „natychmiastowej” niezmienności.

2) Modele Sagas

1. Saga Orchestrator-Centralny koordynator zarządza krokami i rekompensatami.

Plusy: wyraźny przepływ, kontrola błędów, uproszczona telemetria.
Minusy: punkt centralizacji, ryzyko koordynatora „tłuszczu”.

2. Choreografia (choreografia): brak centrum - kroki są inicjowane przez wydarzenia („service A did X → service B reacts”).

Plusy: słaba łączność, proste skalowanie.
Minusy: trudniej jest śledzić/debugować przepływ, ryzyko „rozpadu” zasad.

3. TCC (Try-Confirm/Anuluj) - Każdy krok to „Spróbuj”, a następnie Potwierdź lub Anuluj.

Plusy: bliżej pseudo-dwufazowego protokołu, zarządzanych zasobów.
Minusy: droższe we wdrażaniu interfejsów; wymaga „Spróbuj” czasu posiadacza.


3) Projekt boiska i kompensacji

Niezmienne: wyraźnie podać, co powinno być prawdziwe „przed/po” kroku (na przykład „pozostałość ≥ 0”).
Transakcja kompensacyjno-odwrotna: jest to logiczne działanie, które anuluje efekt biznesowy (zwrot, zwolnienie, przywrócenie).
Idempotencja: zarówno krok, jak i kompensator muszą być bezpiecznie powtarzane (przez 'operation _ id').
Terminy: każdy krok ma termin; opóźnienie powoduje odszkodowanie.
Efekty bezzwrotne: zapisać je oddzielnie (powiadomienia, e-mail) i umożliwić „najlepszy wysiłek”.


4) Spójność i porządek

Ewentualna spójność: użytkownicy mogą dostrzec rozbieżności czasowe; UX - z „czekać „/spinners/statusy.
Zamówienie według klucza - Grupa kroki przełączania według klucza biznesowego (order_id), aby zamówić zdarzenia.
Deduplikacja - Przechowywanie dziennika przetwarzania ('operation _ id' → status) z TTL.


5) Transport i niezawodność

Outbox pattern-Zapisuje zdarzenie do lokalnej tabeli outbox w ramach tej samej transakcji, a następnie asynchronicznie publikuje go do autobusu.
Sklep Inbox/Idempotency: po stronie konsumenta - dziennik wiadomości już przetworzonych.
Dokładnie raz skutecznie: „outbox + idempotent consumer” daje praktyczne „dokładnie raz”.
DLQ: dla „trujących” wiadomości z bogatymi meta-informacjami i bezpiecznym przekierowaniem.


6) Błąd, przekwalifikowanie, polityka backoff

Powtarzamy tylko idempotentne kroki; operacje pisania - z 'Idempotence-Key'.
Wykładniczy backoff + jitter; ograniczenie prób i skrócony termin sagi.
Przy degradacji systemowej - wyłącznik i wdzięku degradacji (na przykład, anulować drugorzędną część fikcji sagi).
Konflikty biznesowe („409”) - ponowna próba po uzgodnieniu lub zrekompensować i zakończyć.


7) Orkiestra: Obowiązki i struktura

Funkcje:
  • Śledzenie stanu sagi: „OCZEKUJĄCE → URUCHOMIENIE → KOMPENSOWANIE → ZROBIONE/NIEUDANE”.
  • Planowanie kroków, terminy, timeouts, rekolekcje.
  • Routing zdarzeń i uruchomienie rekompensaty.
  • Idempotencja operacji koordynatora (dziennik poleceń).
  • Obserwowalność: korelacja 'saga _ id' w logach/śladach/metrykach.
Przechowywanie:
  • Tabele 'saga', 'saga _ step', 'commands', 'outbox'.
  • Indeksy na 'saga _ id',' business _ key ',' status ',' next _ run _ at '.

8) Choreografia: zasady i ochrona przed „śnieżną kulą”

Umowy na imprezy: programy i wersioning (Avro/Proto/JSON Schema).
Jasne semantyki: „event fact” vs „command”.
Zatrzymanie łańcucha: usługa, po wykryciu niedopasowania, publikuje zdarzenie 'Failed '/' Compensate'.
Alarmy i alarmy na „niekończące się pętle”.


9) TCC: szczegóły praktyczne

Spróbuj: rezerwy zasobów z TTL.
Potwierdź: commit, zwolnij tymczasowe zamki.
Anuluj: rezerwowy rollback (bez skutków ubocznych).
Kolekcja śmieci: automatyczne anulowanie Try after TTL (idempotent Anuluj).
Potwierdź/anuluj idempotent: powtórzenie jest bezpieczne.


10) Przykład (program słów) - „Zamówienie z płatnością i dostawą”

1. • Zamówienie (lokalne) → skrzynka wybierana: ' Created'.
2. Usługa internetowa: rezerwa „Spróbuj” (TCC); jeśli → "" "Reserved 'succeeds, jeśli'" Nie powiodło się "→ nie powiodło się.
3. Wynalazek: rezerwa produktów; z → „Wynalazek nie powiódł się”.
4. Usługa wysyłkowa - Utwórz gniazdo dostawy (anulowane).
5. Jeśli dowolny 'Nieudany' krok → Orkiestra rozpoczyna kompensacje w odwrotnej kolejności: 'Anuluj wysyłkę' → 'Ekwipunek' → 'Anuluj'.
6. Jeśli wszystko w porządku → „Potwierdź” → „Potwierdzone”.


11) Pseudokod orkiestrowy

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) Obserwowalność i operacyjne układy SLO

Śledzenie: pojedyncze 'saga _ id', adnotacje' krok ',' próba ',' decyzja '(run/compensate/skip).

Metryka:
  • Sukces/błąd sagów (%), średni czas trwania, p95/p99.
  • Udział zrekompensowanych sag, główne przyczyny odszkodowania.
  • Kolejki/skrzynki zewnętrzne, przekłada się w krokach.
  • Dzienniki/audyty: rozwiązania orkiestrowe, identyfikatory zasobów, klucze biznesowe.

13) Testowanie i chaos

Wtryskiwanie błędów do każdego kroku: timeouts, '5xx', konflikty biznesowe.
Zdarzenia pozasądowe, duplikaty, krople.
Długie ogony opóźnienia → sprawdzanie terminów i rekompensaty.
Masowe sagi → sprawdzanie WFQ/DRR i czapki w kolejkach, brak „blokowania head-of-line”.
Redrave z DLQ w krokach i w całej sadze.


14) Wielopoziomowość, regiony, zgodność

Najemca tagów _ id/plan/region 'w zdarzeniach i repozytoriach sagi.
Miejsce zamieszkania: dane/wydarzenia nie opuszczają regionu; międzyregionalne sagi są projektowane jako federacje lokalnych sag + imprez agregacyjnych.
Priorytety: sagi VIP mają większą wagę kontyngentu; izolacja pracowników na najemcę.


15) Lista kontrolna przedsprzedaży

  • Każdy krok ma wyraźny kompensator, oba są idempotentne.
  • Wybrany szablon: orkiestra/choreografia/TSS; opisano limity odpowiedzialności.
  • Outbox/Inbox implemented, deduplication by 'operation _ id'.
  • Polityka retrasy: backoff with jitter, spróbuj limitów i ogólny termin sagi.
  • Umowy o zdarzenia są zmieniane, istnieje zatwierdzenie programu.
  • Konfiguracja DLQ i Secure Release.
  • Telemetria: mierniki, odwzorowanie, korelacja "saga _ id'.
  • Operacyjne playbooks: ręczne anulowanie/siłowe potwierdzenie, odblokowanie sagów „hung”.
  • Chaos i test obciążenia przejść, SLO/budżet błędu zdefiniowane.

16) Typowe błędy

Nie ma kompensatora lub jest „nieczysty” (ma skutki uboczne).
Nie ma idempotencji/dedup - podwójne i „huśtawki” państw.
„Saga w Sadze” bez wyraźnych granic - cykli i wzajemnych zamków.
Nie ma terminów → „wieczne” sagi i wycieki zasobów.
Orkiestra przechowuje stan „w pamięci” bez stabilnego sklepu.
Choreografia bez centrum telemetrycznego → „niewidzialne” awarie.
Opaque UX: Użytkownicy nie widzą statusów pośrednich.


17) Szybkie przepisy kulinarne

Klasyka SaaS: orkiestra + skrzynka odbiorcza/skrzynka odbiorcza, wykładnicze backoff, DLQ, statusy sagi w UI.
Silne zasoby niezmienne: TCC z rezerwą TTL i GC Anuluj.
Duża objętość/obciążenie: choreografia wydarzeń + ścisła iempotencja i kluczowe wskaźniki.
Wielobranżowe: sagi lokalne + kruszywa końcowe; unikać globalnych zamków.


Wniosek

Sagi są sposobem na uzyskanie przewidywalnej spójności w systemach rozproszonych bez globalnych blokad. Przejrzyste kompensatory, idempotencja, niezawodna dostawa (skrzynka odbiorcza/skrzynka odbiorcza), dyscyplina timeout i retray, a także telemetria i playbook są kluczem do zapewnienia, że złożone procesy biznesowe pozostają stabilne i czytelne wraz ze wzrostem obciążenia, liczby usług i geografii.

Contact

Skontaktuj się z nami

Napisz do nas w każdej sprawie — pytania, wsparcie, konsultacje.Zawsze jesteśmy gotowi pomóc!

Rozpocznij integrację

Email jest wymagany. Telegram lub WhatsApp są opcjonalne.

Twoje imię opcjonalne
Email opcjonalne
Temat opcjonalne
Wiadomość opcjonalne
Telegram opcjonalne
@
Jeśli podasz Telegram — odpowiemy także tam, oprócz emaila.
WhatsApp opcjonalne
Format: kod kraju i numer (np. +48XXXXXXXXX).

Klikając przycisk, wyrażasz zgodę na przetwarzanie swoich danych.