Sagas και κατανεμημένες συναλλαγές
Ένα έπος είναι μια μακροπρόθεσμη επιχειρηματική συναλλαγή που υποδιαιρείται σε μια σειρά τοπικών σταδίων σε διάφορες υπηρεσίες/αποθετήρια. Κάθε βήμα έχει μια αντισταθμιστική δράση που ανατρέπει το αποτέλεσμα του βήματος σε μερική αποτυχία. Σε αντίθεση με 2PC/3PC, τα σάγκα δεν κρατούν παγκόσμιες κλειδαριές και είναι κατάλληλα για μικροϋπηρεσίες, πολυπεριφέρειες και υψηλά φορτία, όπου η ενδεχόμενη συνέπεια είναι αποδεκτή.
1) Πότε να επιλέξετε sagas (και πότε όχι)
Προσαρμοσμένο:- Επιχειρηματικές διαδικασίες μακράς/πολλαπλής φάσης (εντολή πληρωμής αποθεματικό παράδοσης).
- Διαφορετικοί τομείς και αποθετήρια όπου δεν υπάρχει κοινή συναλλαγή.
- Χρειάζονται υψηλή διαθεσιμότητα και κλιμάκωση.
- Η ατομικότητα του στερεού οξέος είναι κρίσιμη (για παράδειγμα, η μεταφορά μεγάλων ποσοτήτων εντός του ίδιου μητρώου).
- Δεν υπάρχει σαφής αντιστάθμιση (δεν μπορείτε να «αποθεματοποιήσετε» ή να ακυρώσετε το αποτέλεσμα).
- Οι νομικοί/κανονιστικοί περιορισμοί απαιτούν αυστηρή απομόνωση και «άμεση» αμετάβλητη.
2) Μοντέλα Sagas
1. Saga Orchestrator - Ο κεντρικός συντονιστής διαχειρίζεται βήματα και αποζημιώσεις.
Υπέρ: ρητή ροή, έλεγχος σφαλμάτων, απλουστευμένη τηλεμετρία.
Cons: σημείο συγκέντρωσης, κίνδυνος συντονιστή «λίπος».
2. Χορογραφία (Χορογραφία): κανένα κέντρο - τα βήματα ξεκινούν από εκδηλώσεις («η υπηρεσία A έκανε X → υπηρεσία B αντιδρά»).
Πλεονεκτήματα: αδύναμη συνδεσιμότητα, απλή κλιμάκωση.
Κατά: είναι πιο δύσκολο να εντοπιστεί/αποσφαλματωθεί η ροή, ο κίνδυνος «sprawl» των κανόνων.
3. TCC (Δοκιμάστε επιβεβαίωση/ακύρωση) - Κάθε βήμα είναι «Δοκιμάστε», στη συνέχεια επιβεβαιώστε ή ακυρώστε.
Pros: πιο κοντά στο ψευδο-διφασικό πρωτόκολλο, διαχειριζόμενοι πόρους.
κατά: ακριβότερο κατά την υλοποίηση των διεπαφών· Απαιτεί χρονοδιαγράμματα «Δοκιμάστε».
3) Σχεδιασμός γηπέδου και αντιστάθμισης
Αναλλοίωτες: δηλώστε σαφώς τι πρέπει να είναι αληθές «πριν/μετά» το βήμα (για παράδειγμα, «υπόλοιπο ≥ 0»).
Αντιστροφή ≠ αντίστροφη συναλλαγή: πρόκειται για μια λογική ενέργεια που ακυρώνει το επιχειρηματικό αποτέλεσμα (επιστροφή χρημάτων, αποδέσμευση, αποκατάσταση).
Ταυτότητα: τόσο το βήμα όσο και ο αντισταθμιστής πρέπει να επαναλαμβάνονται με ασφάλεια (με «λειτουργία _ id»).
Timeouts: κάθε βήμα έχει προθεσμία· η καθυστέρηση προκαλεί αποζημίωση.
Αποτελέσματα μη επιστροφής: να καταγραφούν χωριστά (κοινοποιήσεις, ηλεκτρονικό ταχυδρομείο) και να καταστεί δυνατή η «βέλτιστη προσπάθεια».
4) Συνέπεια και τάξη
Ενδεχόμενη συνέπεια: οι χρήστες μπορούν να δουν χρονικές αποκλίσεις. UX - με «wait «/spinners/status.
Άρθρο 4 παράγραφος 1 σημείο 114) του ΚΚΑ.
Αφαίρεση - Αποθήκευση του ημερολογίου επεξεργασίας (κατάσταση λειτουργίας _ i →) με το TTL.
5) Μεταφορά και αξιοπιστία
Outbox μοτίβο-Γράφει το γεγονός στον τοπικό πίνακα outbox μέσα στην ίδια συναλλαγή, και στη συνέχεια το δημοσιεύει ασύγχρονα στο λεωφορείο.
Inbox/Idempotency store: από την πλευρά του καταναλωτή - ένα αρχείο με μηνύματα που έχουν ήδη υποστεί επεξεργασία.
Ακριβώς μία φορά αποτελεσματικά: «outbox + idempotent καταναλωτής» δίνει μια πρακτική «ακριβώς μία φορά».
DLQ: για «δηλητηριώδη» μηνύματα με πλούσιες μετα-πληροφορίες και ασφαλή redrive.
6) Σφάλμα, επανακαταμέτρηση, εφεδρικές πολιτικές
Επαναλαμβάνουμε μόνο idempotent βήματα? εγγραφή πράξεων - με το 'Idempotency-Key'.
Εκθετική εφεδρεία + νευρικότητα; τον περιορισμό των προσπαθειών και της συνοπτικής προθεσμίας για το έπος.
Με συστηματική υποβάθμιση - Διακόπτης κυκλώματος και χαριτωμένη υποβάθμιση (για παράδειγμα, ακυρώστε το δευτερεύον τμήμα της φαντασίας του έπους).
Επιχειρηματικές συγκρούσεις ('409') - επανάληψη της διαδικασίας μετά τη συμφιλίωση ή αποζημίωση και τερματισμός.
7) Ενορχηστρωτής: Αρμοδιότητες και δομή
Λειτουργίες:- Παρακολούθηση της κατάστασης του έπους: «ΕΚΚΡΕΜΕΙ → ΤΡΕΧΕΙ → ΑΠΟΖΗΜΙΩΣΗΣ → ΤΕΛΕΙ/ΑΠΟΤΥΓΧΑΝΕΙ».
- Βήματα σχεδιασμού, προθεσμίες, χρονοδιαγράμματα, υποχωρήσεις.
- Δρομολόγηση γεγονότων και εκτόξευση αποζημίωσης.
- Ταυτότητα των λειτουργιών συντονιστή (αρχείο καταγραφής εντολών).
- Παρατηρησιμότητα: συσχέτιση 'saga _ id' σε αρχεία καταγραφής/ίχνη/μετρήσεις.
- Πίνακες 'saga', 'saga _ step', 'command ,' outbox '.
- Ευρετήρια στο 'saga _ id', 'business _ key', 'status', 'next _ run _ a .
8) Χορογραφία: κανόνες και προστασία έναντι της χιονόμπαλας
Συμβάσεις εκδηλώσεων: συστήματα και εκδόσεις (Avro/Proto/JSON Schema).
Σαφής σημασιολογία: «γεγονός γεγονός» έναντι «εντολή».
Διακοπή της αλυσίδας: η υπηρεσία, έχοντας εντοπίσει μια αναντιστοιχία, δημοσιεύει ένα «αποτυχημένο »/« αντισταθμιστικό» γεγονός.
Συναγερμοί και προειδοποιήσεις για «ατελείωτους βρόχους».
9) TCC: πρακτικές λεπτομέρειες
Δοκιμάστε: αποθεματικό πόρων με TTL.
Επιβεβαίωση: δέσμευση, απελευθέρωση προσωρινών κλειδαριών.
Ακύρωση: εφεδρικό rollback (χωρίς ανεπιθύμητες ενέργειες).
Συλλογή απορριμμάτων: αυτόματη ακύρωση του Try after TTL (idempotent Cancel).
Επιβεβαίωση/Ακύρωση idempotent: η επανάληψη είναι ασφαλής.
10) Παράδειγμα (σύστημα λέξεων) - «Εντολή πληρωμής και παράδοσης»
1. CrealOrder (τοπικό) outbox: 'Designed'.
2. Reserve (TCC), εάν → 'ChampionReserved' succeeds, εάν το 'ChampionSfailed' → αποτύχει.
3. InventoryService: απόθεμα προϊόντων· από → 'InventoryFailed'.
4. Υπηρεσία DefinitionService - Δημιουργία χρονοθυρίδας παράδοσης (ακυρώσιμη).
5. Εάν κάποιο «αποτυχημένο» βήμα ο ενορχηστρωτής αρχίζει τις αντισταθμίσεις με την αντίστροφη σειρά: «Ακύρωση» « Απογραφή» «Ακύρωση».
6. Αν όλα εντάξει → 'ChampionSelf' → 'OrgerReferenced'.
11) Ψευδοκώδικας ενορχηστρωτής
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) Παρατηρησιμότητα και λειτουργικές SLO
Εντοπισμός: single 'saga _ id', σημειώσεις 'βήμα', 'προσπάθεια', 'απόφαση' (τρέξιμο/αντιστάθμιση/skip).
Μετρήσεις:- Επιτυχία/σφάλμα του sagas (%), μέση διάρκεια, p95/p99.
- Το μερίδιο του αντισταθμισμένου sagas, βασικοί λόγοι αποζημίωσης.
- Ουρές αναμονής/υστερήσεις outbox, retrays σε σκαλοπάτια.
- Καταγραφές/έλεγχοι: λύσεις ενορχηστρωτών, αναγνωριστικά πόρων, κλειδιά επιχειρήσεων.
13) Δοκιμές και χάος
Εισάγοντας σφάλματα σε κάθε βήμα: timeouts, '5xx', επιχειρηματικές συγκρούσεις.
Εκτός τάξης συμβάντα, αντίγραφα, σταγόνες.
Μεγάλες ουρές καθυστέρησης → έλεγχος προθεσμιών και αποζημιώσεων.
Σάγκας μάζας → έλεγχος WFQ/DRR και καπάκια σε ουρές αναμονής, απουσία «εμπλοκής κεφαλής γραμμής».
Redrave από DLQ σε βήματα και σε ένα ολόκληρο έπος.
14) Πολυπλοκότητα, περιφέρειες, συμμόρφωση
Ενοικιαστής ετικετών _ id/plan/region 'in events και αποθετήρια saga.
Κατοικία: τα δεδομένα/γεγονότα δεν εγκαταλείπουν την περιοχή. τα διαπεριφερειακά σάγκα σχεδιάζονται ως ομοσπονδίες τοπικών σάγκας + συνάθροισης εκδηλώσεων.
Προτεραιότητα: τα VIP sagas φέρουν μεγαλύτερο βάρος ποσόστωσης. απομόνωση των εργαζομένων ανά ενοικιαστή.
15) Κατάλογος ελέγχου πριν από την πώληση
- Κάθε βήμα έχει μια σαφή αντιστάθμιση, και τα δύο είναι idempotent.
- Επιλεγμένο πρότυπο: ενορχήστρωση/χορογραφία/TSS. περιγράφονται τα όρια ευθύνης.
- Το Outbox/Inbox υλοποιήθηκε, αφαίρεση από την «λειτουργία _ id».
- Πολιτικές επαναπροσδιορισμού: εφεδρεία με νευρικότητα, δοκιμαστικά όρια και συνολική προθεσμία ύπνου.
- Οι συμβάσεις γεγονότων έχουν εκδοθεί, υπάρχει επικύρωση του συστήματος.
- Το DLQ και το Secure Release είναι ρυθμισμένα.
- Τηλεμετρία: μετρήσεις, ιχνηλάτηση, συσχέτιση 'saga _ id'.
- Λειτουργικά βιβλία: χειροκίνητη ακύρωση/επιβεβαίωση δύναμης, ξεκλείδωμα «κρεμασμένων» sagas.
- Πέρασμα των δοκιμών χάους και φορτίου, καθορισμένος προϋπολογισμός SLO/σφάλματος.
16) Τυπικά σφάλματα
Δεν υπάρχει αντισταθμιστικός παράγοντας ή είναι «ακάθαρτος» (έχει ανεπιθύμητες ενέργειες).
Δεν υπάρχει idempotence/dedup - doubles και swings των κρατών.
«Saga in Saga» χωρίς σαφή όρια - κύκλους και αμοιβαίες κλειδαριές.
Δεν υπάρχουν προθεσμίες → «αιώνια» σάγκα και διαρροές πόρων.
Ο ενορχηστρωτής αποθηκεύει την κατάσταση «στη μνήμη» χωρίς σταθερό κατάστημα.
Η χορογραφία χωρίς κέντρο τηλεμετρίας → «αόρατες» αποτυχίες.
Αδιαφανές UX: Οι χρήστες δεν βλέπουν ενδιάμεσες καταστάσεις.
17) Γρήγορες συνταγές
Κλασικά SaaS: ενορχήστρωση + outbox/inbox, εκθετική backoff, DLQ, saga statuses in UI.
Ισχυρές αναλλοίωτες πηγές: TCC με αποθεματικό TTL και GC Cancel.
Υψηλός όγκος/φορτίο: χορογραφία γεγονότων + αυστηρή ιδεατότητα και βασικές μετρήσεις.
Πολυπεριφέρεια: τοπικό sagas + τελικά συγκεντρωτικά στοιχεία· αποφυγή παγκόσμιων κλειδαριών.
Συμπέρασμα
Το Sagas είναι ένας τρόπος για να επιτευχθεί προβλέψιμη συνέπεια στα κατανεμημένα συστήματα χωρίς παγκόσμιες κλειδαριές. Οι σαφείς αντισταθμιστές, η ταυτότητα, η αξιόπιστη παράδοση (outbox/inbox), η πειθαρχία χρονοδιαγράμματος και επανασυσκευασίας, καθώς και η τηλεμετρία και τα βιβλία παιχνιδιών αποτελούν το κλειδί για να εξασφαλιστεί ότι οι περίπλοκες επιχειρηματικές διαδικασίες παραμένουν σταθερές και ευανάγνωστες με αυξανόμενο φορτίο, αριθμό υπηρεσιών και γεωγραφίες.