GH GambleHub

Πρότυπο Saga και κατανεμημένες συναλλαγές

Πρότυπο Saga και κατανεμημένες συναλλαγές

1) Γιατί χρειάζονται sagas

Η κλασική 2PC (διφασική σύσφιξη) είναι ανεπαρκώς κλιμακωτή, πολύπλοκη υπό αστοχίες και μπλοκάρει τους πόρους. Το έπος κατανέμει τη συνολική επιχειρηματική διαδικασία σε μια σειρά τοπικών συναλλαγών (στάδια), καθεμία από τις οποίες δεσμεύεται ανεξάρτητα. Σε περίπτωση αποτυχίας, τα επόμενα βήματα ακυρώνονται και αυτά που έχουν ήδη ολοκληρωθεί αντισταθμίζονται από αντίστροφες πράξεις.
Το αποτέλεσμα: διαχείριση της ενδεχόμενης συνέπειας χωρίς παγκόσμιο αποκλεισμό, υψηλή επιβίωση και ένα σαφές πρωτόκολλο αποκατάστασης.

2) Βασικά μοντέλα

2. 1 Ενορχήστρωση

Ένας ειδικός συντονιστής έπος διαχειρίζεται τα βήματα: στέλνει εντολές, περιμένει απαντήσεις/γεγονότα, ξεκινά αποζημιώσεις.
Υπέρ: κεντρικός έλεγχος, απλή παρατηρησιμότητα, σαφείς προθεσμίες. Κατά: Προαιρετικό στοιχείο.

2. 2 Χορογραφία

Δεν υπάρχει συντονιστής· οι υπηρεσίες ανταποκρίνονται στις εκδηλώσεις του άλλου («OrgerPlaced» → «ChampionCaptured» → «InventoryReserved»...).
Πλεονεκτήματα: Αδύναμη συνδεσιμότητα. Κατά: πιο δύσκολο να εντοπιστεί, κίνδυνος «χορού θανάτου» χωρίς σαφείς κανόνες.

2. 3 TCC (Δοκιμάστε επιβεβαίωση/ακύρωση)

Επιλογή με «δέσμευση» πόρων:

1. Δοκιμάστε - προετοιμασία/αποθεματικό,

2. Επιβεβαίωση - προσδιορισμός,

3. Ακύρωση - rollback.

Οι εγγυήσεις είναι υψηλότερες, αλλά οι συμβάσεις και τα αποθεματικά είναι πιο περίπλοκα.

3) Βαθμίδες και συμβάσεις αποζημίωσης

Κάθε βήμα = τοπική συναλλαγή + αποζημίωση (idempotent, επιτρέπει την επανάληψη).
Η αποζημίωση δεν απαιτείται για την πλήρη «επιστροφή του κόσμου» - η ισοδυναμία τομέα είναι αρκετή (για παράδειγμα, η «επιστροφή» αντί της «διαγραφής πληρωμής»).
Ορισμός των αναλλοίωτων: για τα χρήματα - το υπόλοιπο δεν μειώνεται· για παραγγελίες - χωρίς καθεστώς «κρεμασμένου».
Εισάγετε προθεσμίες/αποθέματα TTL και έναν «συλλέκτη απορριμμάτων» για καθυστερημένες προσπάθειες.

4) Συνοχή και σημασιολογία παράδοσης

Παράδοση μηνύματος: τουλάχιστον μία φορά (εξ ορισμού) → όλες οι πράξεις πρέπει να είναι ταυτόσημες.
Σειρά: σημαντική ανά κλείδα συσχέτισης (π.χ. 'order _ i ,' player _ id ').
Ακριβώς μια φορά δεν είναι ο στόχος του έπους? επιτυγχάνουμε αποτελεσματική ομοιομορφία μέσω idempotent κλειδιών, outbox/inbox και σωστής δέσμευσης.

5) Η κατάσταση του έπους και το ημερολόγιό του

Τι να φυλάσσεται:
  • 'saga _ i ,' συσχέτιση _ i , τρέχουσα κατάσταση (τρέχουσα/ολοκληρωμένη/αντισταθμιστική/αντισταθμιστική/αποτυχημένη),
  • βαθμίδα και τις μεταβλητές της (ταυτότητες πληρωμής/αποθεματικό),
  • ιστορικό (log) γεγονότων/αποφάσεων, χρονοσφραγίδων, προθεσμιών, του αριθμού των επαναπροσδιορισμών.
Πού να φυλάσσεται:
  • Χωριστή αποθήκη Saga (πίνακας/έγγραφο) στη διάθεση του συντονιστή.
  • Για τη χορογραφία - τοπικοί «πράκτορες» του έπους, δημοσιεύοντας εκδηλώσεις καθεστώτος σε ένα κοινό θέμα.

6) Αξιόπιστες εκδόσεις: outbox/inbox

Outbox: το βήμα δεσμεύει την αλλαγή και γράφει το γεγονός/εντολή στον πίνακα outbox σε μία συναλλαγή. ο εργαζόμενος δημοσιεύει στο ελαστικό.
Εισερχόμενα: ο καταναλωτής διατηρεί έναν πίνακα επεξεργασμένων 'message _ id' → dedup + idempotency.
Μετά από µια επιτυχηµένη ανεπιθύµητη ενέργεια, προσαρµόστε την όφσετ/ACK (Kafka/RabbitMQ) - όχι νωρίτερα.

7) Σχεδιασμός σταδίων saga

7. 1 Παράδειγμα (αγορά iGaming/ηλεκτρονικού εμπορίου)

1. Τοποθέτηση Διαταγή → κατάσταση 'ΕΚΚΡΕΜΕΙ'.
2. Εξουσιοδότηση πληρωμής (Δοκιμάστε) → 'πληρωμή _ hold _ id'.
3. Απόθεμα → 'κράτηση _ id'.
4. CapturePayment (Επιβεβαίωση).
5. Τελική διαταγή → 'ΟΛΟΚΛΗΡΩΣΗ'.

Αποζημιώσεις:
  • εάν (3) η → 'CancelCholdHold' αποτυγχάνει·
  • (4) απέτυχε μετά την (3) «Απογραφή »·
  • εάν (5) η «απογραφή επιστροφής χρημάτων» και «→ απογραφής» αποτυγχάνει.

7. 2 Προθεσμίες/Υποχωρήσεις

Μέγιστο N retrays με εκθετική καθυστέρηση + jitter.
Μετά την υπέρβαση - πηγαίνετε στην «αντιστάθμιση».
Φυλάσσετε σε next_attempt_at και deadline_at για κάθε βήμα.

8) Ενορχηστρωτής έναντι πλατφόρμας

Επιλογές:
  • Ελαφρύς οικιακός ενορχηστρωτής (microservice + Saga table).
  • Πλατφόρμες: Temporal/Cadence, Camunda, Netflix Conductor, Zeebe - δώστε χρονοδιακόπτες, retrays, μακρόβιες ροές εργασίας, ορατότητα και μια διαδικτυακή κονσόλα.
  • Για τη χορογραφία, χρησιμοποιήστε έναν κατάλογο γεγονότων και ένα αυστηρό status/key convention.

9) Πρωτόκολλα ένταξης

9. 1 Ασύγχρονη (Kafka/RabbitMQ)

Εντολές: 'πληρωμές. να εγκρίνει. v1 ',' απογραφή. αποθεματικό. v1 '.
Γεγονότα: πληρωμές. έχει εγκριθεί. v1 ',' απογραφή. δεσμευμένο. v1 ',' πληρωμές. αιχμαλωτίστηκε. v1 ',' πληρωμές. επιστραφείσα. v1 '.
Μέρος κλειδί = 'order _ i /' player _ id' for order.

9. 2 Συγχρονισμένη (HTTP/gRPC) σε ένα βήμα

Ισχύει για «σύντομα» βήματα, αλλά πάντα με χρονοδιαγράμματα/retrays/idempotency και επιστροφή σε ασύγχρονη αποζημίωση.

10) Ταυτότητα και κλειδιά

Σε αιτήματα εντολής και αποζημίωσης, περάστε 'idempotency _ key'.
Οι ανεπιθύμητες ενέργειες (εγγραφή στη βάση δεδομένων/διαγραφή) εκτελούνται υπό όρους: «εκτελέστε αν δεν έχετε δει ακόμα 'idempotency _ key'».
Η αποζημίωση είναι επίσης ταυτόσημη: η επανάληψη της «επιστροφής χρημάτων (id = X)» είναι ασφαλής.

11) Χειρισμός σφαλμάτων

Κλάσεις:
  • Προσωρινή (δίκτυα/χρονοδιαγράμματα) → επανασυσκευασία/εφεδρική.
  • Επιχειρήσεις (ανεπαρκή κεφάλαια, όρια) → άμεση αποζημίωση/εναλλακτική πορεία.
  • Μη ανακτήσιμη → χειροκίνητη παρέμβαση, μη ανακτήσιμη αποζημίωση.
  • Κατασκευή ενός πίνακα λύσεων: ενέργεια τύπου σφάλματος (επανάληψη/αντιστάθμιση/κλιμάκωση).

12) Παρατηρησιμότητα και SLO sag

SLI/SLO:
  • Καθυστέρηση από το τέλος έως το τέλος του έπους (p50/p95/p99).
  • Ποσοστό επιτυχίας.
  • Μέσος χρόνος για την αντιστάθμιση и ποσοστού αποζημίωσης.
  • Ορφανά σάγκα και χρόνος μέχρι GC.
  • Ίχνος: 'trace _ id '/' saga _ id' ως σύνδεσμος εύρους μεταξύ βημάτων. μετρήσεις επιτοκίων καύσης για τους προϋπολογισμούς σφαλμάτων.

Logs: κάθε saga αλλαγή κατάστασης = δομημένη εγγραφή με αιτία.

13) Παραδείγματα (ψευδοκώδικας)

13. 1 Ενορχηστρωτής (ιδέα)

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 (ιδέα πίνακα)


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. Χορογραφία (θεματικές ιδέες)

Διαταγές. «→ καταναλωτές: » πληρωμές. εγκρίνει την απογραφή «,». αποθεματικό "

"πληρωμές. επιτρεπόμενη απογραφή «+». δεσμευμένες εντολές «→». try_finalize'

Οποιαδήποτε αποτυχία των εντολών των →. να αντισταθμίζει τις πληρωμές που έχουν αρχίσει. ακύρωση/επιστροφή «,» απογραφή. απελευθέρωση '.

14) Σύγκριση με την 2PC και την Ισπανία

: ισχυρή συνέπεια, αλλά εμπόδια, εμπόδια, σωλήνες χαλκού.
Σάγκα: ενδεχόμενη συνέπεια, χρειάζεσαι πειθαρχία αποζημίωσης και τηλεμετρίας.
Πηγή γεγονότων: αποθηκεύει τα γεγονότα ως πηγή αλήθειας. Τα σάγκα είναι φυσικά, αλλά προσθέτουν πολυπλοκότητα στις μεταναστεύσεις/στιγμιότυπα.

15) Ασφάλεια και συμμόρφωση

Ασφάλεια μεταφορών (TLS/mTLS), ACL ανά θέμα/σειρά αναμονής.
Σε γεγονότα - τουλάχιστον PII, κρυπτογράφηση ευαίσθητων πεδίων, μαρκινοποίηση.
Πρόσβαση σε λογιστικούς ελέγχους και καταγραφές αποζημιώσεων.
SLA με εξωτερικούς παρόχους (πληρωμές/παράδοση) = προθεσμίες και οριακές παράμετροι επαναπροσδιορισμού.

16) Κατάλογος ελέγχου εφαρμογής (0-45 ημέρες)

0- 10 ηµέρες

Επιλέξτε τις υποψήφιες διαδικασίες (πολλαπλές υπηρεσίες, αντισταθμισμένες).
Επιλέξτε το μοντέλο (ενορχήστρωση/χορογραφία/TCC) και το κλειδί συσχέτισης.
Περιγράψτε βαθμίδες/αντισταθμίσεις, αναλλοίωτες και προθεσμίες. Σηκώστε τους πίνακες 'saga', 'outbox', 'inbox'.

11-25 ημέρες

Συμπεριλαμβάνονται outbox/inbox, idempotency, και backoff retraces.
Ανάπτυξη του πρώτου sagas. Προσθέστε SLI/SLO ταμπλό και ίχνη.
Γράψτε ένα εγχειρίδιο αντισταθμίσεων (συμπεριλαμβανομένου του εγχειριδίου) και κλιμακώσεων.

26-45 ημέρες

Automate GC «hanging» sagas, περιοδική επανεκκίνηση/συνέχιση της προθεσμίας.
Περάστε την ημέρα παιχνιδιού: σταδιακή αποτυχία, υπέρβαση προθεσμίας, μη διαθεσιμότητα μεσίτη.
Τυποποιήστε τις συμβάσεις γεγονότων (εκδόσεις, συμβατότητα), δημιουργήστε έναν «κατάλογο saga».

17) Αντι-μοτίβα

«Αντιστάθμιση = διαγραφή από τη βάση δεδομένων» αντί της ορθής αντίστροφης δράσης τομέα.
Δεν υπάρχουν outbox/inbox → απώλεια γεγονότων/διπλά αποτελέσματα.
Ρετράι χωρίς νευρικότητα → αυτοεξαρτήσεις DDoS.
Αναμένοντας ισχυρή συνέπεια στην ανάγνωση χωρίς «επεξεργασία σε εξέλιξη»....
Ένας γιγάντιος ενορχηστρωτής για όλους τους → ελέγχουν μονόλιθους.
Ολική χορογραφία χωρίς ορατότητα και SLA → ανεξέλεγκτος χορός.
Αγνοώντας τις προθεσμίες → αιώνια αποθέματα/επιφυλάξεις.

18) Μετρήσεις διάρκειας

Το 90% των κρίσιμων διαδικασιών καλύπτονται από sagas/αποζημιώσεις και έχουν τις περιγραφόμενες αμετάβλητες.
Τα outbox/inbox είναι ενσωματωμένα για όλους τους Tier-0/1 παραγωγούς/καταναλωτές.
SLO: p95 end-to-end saga είναι φυσιολογικό, το ποσοστό επιτυχίας είναι σταθερό, ορφανό <στόχο.
Διαφανής ιχνηλάτηση και πινακίδες ταμπλό «σε βήματα», προειδοποιήσεις με ρυθμό καύσης.
Τριμηνιαίος έλεγχος αποζημίωσης για την ημέρα παιχνιδιού και το εγχειρίδιο λειτουργίας.

19) Συμπέρασμα

Το Saga είναι μια πρακτική σύμβαση συνοχής για τα κατανεμημένα συστήματα: σαφή βήματα και αντίστροφες ενέργειες, πειθαρχία δημοσίευσης (outbox/inbox), προθεσμίες και retrays, παρατηρησιμότητα και διαδικασίες αποζημίωσης. Επιλέξτε ένα μοντέλο (ενορχήστρωση/χορογραφία/TSS), διορθώστε τις αναλλοίωτες και τα κλειδιά, κάντε τους χειριστές idempotent - και οι επιχειρηματικές διαδικασίες πολλαπλών υπηρεσιών σας θα γίνουν προβλέψιμες και σταθερές χωρίς ακριβά 2PC.

Contact

Επικοινωνήστε μαζί μας

Επικοινωνήστε για οποιαδήποτε βοήθεια ή πληροφορία.Είμαστε πάντα στη διάθεσή σας.

Έναρξη ολοκλήρωσης

Το Email είναι υποχρεωτικό. Telegram ή WhatsApp — προαιρετικά.

Το όνομά σας προαιρετικό
Email προαιρετικό
Θέμα προαιρετικό
Μήνυμα προαιρετικό
Telegram προαιρετικό
@
Αν εισαγάγετε Telegram — θα απαντήσουμε και εκεί.
WhatsApp προαιρετικό
Μορφή: κωδικός χώρας + αριθμός (π.χ. +30XXXXXXXXX).

Πατώντας «Αποστολή» συμφωνείτε με την επεξεργασία δεδομένων.