Πώς να οικοδομήσουμε ασφαλή επεξεργασία εκατομμυρίων συναλλαγών την ημέρα
Πλήρες άρθρο
1) Τι σημαίνει ασφαλής για τις συναλλαγές
Αποτυχία-ασφαλής είναι όταν οποιαδήποτε αποτυχημένη κατάσταση οδηγεί είτε σε ασφαλή στάση είτε σε ένα αντισταθμισμένο κράτος χωρίς απώλεια χρημάτων και δεδομένων. Στόχοι:- «Διπλές χρεώσεις/πιστώσεις» = 0.
- Χαμένες συναλλαγές/γεγονότα = 0.
- Προβλέψιμο SLO κατά καθυστέρηση/παράδοση, σαφείς τρόποι αποικοδόμησης και DR.
Βάση - νομισματικές αναλλοίωτες (πραγματικό υπόλοιπο σε ένα μέρος), ταυτότητα, συμφωνημένη παράδοση γεγονότων.
2) Αρχιτεκτονικές αρχές (σύντομες)
1. Ενιαία πηγή αλήθειας: ισολογισμός και λογιστική - στο βιβλίο/πορτοφόλι. Οι υπηρεσίες γύρω κρατούν την κατάσταση των διαδικασιών, όχι τα χρήματα.
2. Idempotency παντού: όλες οι λειτουργίες «γράψτε» παίρνουν 'Idempotency-Key'. επανάληψη επιστρέφει το ίδιο αποτέλεσμα.
3. Γεγονός με εγγύηση παράδοσης: outbox/CDC, ουρές αναμονής, DLQ, deadup.
4. Sagas και αποζημιώσεις, όχι «χειροκίνητες επεξεργασίες».
5. Πίσω πίεση και προτεραιότητες: το σύστημα επιβραδύνεται, αλλά δεν καταρρέει.
6. Προεπιλεγμένη παρατηρησιμότητα: δομημένα αρχεία καταγραφής, ιχνηλάτηση, μετρήσεις.
7. Πολυπεριφέρεια και ΔΚ: περιουσιακό στοιχείο/υποχρέωση από περιουσιακά στοιχεία, τακτική άσκηση.
3) Τοπολογία αναφοράς
Edge/API GW ──Command API ──App Service (Sagas)
│           │
(Outbox TX)
Πίνακας Outbox ──Publisher ──Kafka/Pulsar ──Consumers
│                      │
WAF └─DLQ/Replay
│
(ACID, idempotent debit/credit)
│
 Θέσεις κλειδιά: Outbox (ατομική εγγραφή μιας ομάδας και ένα «σχέδιο» μιας εκδήλωσης), Publisher (ακριβώς μία παράδοση), Consumers (idempotent, with a dedup key), DLQ/Replay (ελεγχόμενες επαναλήψεις).
4) Νομισματικές αναλλοίωτες και συνέπεια
Ισχύει κατά υπόλοιπο - Λογιστική (ACID, σειριακές συναλλαγές ή αυστηρή παραγγελία ανά λογαριασμό).
Εντολές χρήματος: «χρέωση», «πίστωση», «κατοχή», «δέσμευση», «rollback» είναι idempotent.
Οι συνδυασμένες διεργασίες κατασκευάζονται όπως το sagas:- «εξουσιοδότηση → διακανονισμός → πίστωσης», «αίτηση → υποβολή → εκκαθάριση/αποτυχία», «επιστροφή/κενό».
- Καμία άμεση επεξεργασία ισολογισμού που παρακάμπτει το Ledger.
5) Ταυτότητα: βασικός σχεδιασμός
Το κλειδί πρέπει να προσδιορίζει με μοναδικό τρόπο την επιχειρηματική συναλλαγή:- «bet _ id + ποσό + νόμισμα», «payment _ intent + capture _ i ,» payout _ i , «chain _ txid».
- Φυλάσσετε το αποτέλεσμα με κλείδωμα (μνήμη απόκρισης). Επαναλάβετε με το ίδιο κλειδί → το ίδιο σώμα/κατάσταση.
- Παρακολούθηση αναντιστοιχίας - το ίδιο κλειδί με διαφορετικό ποσό → 'IDEMPOTENCY _ MISMATCH'.
6) Ουρές αναμονής, τάξη και νεκρό σημείο
Τα επακριβώς εφικτά αποτελέσματα δεν επιτυγχάνονται με τη μεταφορά, αλλά με την ευφυή αποθήκευση των καταναλωτών + dedup (LRU/Redis/DB c TTL).
Κρατήστε τη σειρά κλειδιών (κλειδί κατάτμησης = 'λογαριασμός _ id/round _ id/player _ id').
Για «ετερογενή» κλειδιά - μηχάνημα κατάστασης ανά οντότητα.
Η DLQ είναι υποχρεωτική: μετά από N απόπειρες - σε ένα απομονωμένο θέμα με αναγνώσιμο από τον άνθρωπο σκοπό.
7) Outbox/CDC: Γιατί τα γεγονότα «δεν χάνονται»
Στο πλαίσιο μιας συναλλαγής, καταγράφουμε τόσο μια επιχειρηματική αλλαγή όσο και μια καταχώρηση outbox στη βάση δεδομένων υπηρεσιών.
Ένας ξεχωριστός εκδότης διαβάζει το outbox και το δημοσιεύει στο λεωφορείο επιβεβαίωσης.
Εναλλακτικά, το CDC (Change Data Capture) σε επίπεδο βάσης δεδομένων (Debezium/replication log).
Κανένα «αρχείο καταγραφής γεγονότων» μετά τη συναλλαγή δεν αποτελεί πηγή ζημίας.
8) Οπισθοδρόμηση και προτεραιότητες
Token κουβάδες και ποσοστώσεις εισροών (ανά ενοικιαστή/εμπορικό σήμα/περιφέρεια).
Ουρές προτεραιότητας: μονοπάτια χρήματος πάνω από το promo/τηλεμετρία.
Όταν υπερφορτώνεται: οι λειτουργίες «χωρίς νέες συνεδρίες/αιτήματα», παγώνοντας δευτερεύοντα χαρακτηριστικά, εξοικονομώντας τον πυρήνα.
Αυτόματη υποβάθμιση: μείωση της συχνότητας των εργασιών υποβάθρου, δυναμική επέκταση των κρίσιμων εργαζομένων.
9) Πολυπεριφερειακή βιωσιμότητα
Περιουσιακό στοιχείο για API και ουρές αναμονής, τοπικό βιβλίο (ή παγκόσμιο με χάραξη περιοχής/νομίσματος).
Κατοικία δεδομένων: Τα χρήματα/PII/αρχεία καταγραφής δεν διαγράφονται χωρίς ρητούς κανόνες.
Η αναπαραγωγή γεγονότων είναι διαπεριφερειακή - ασύγχρονη, σημειωμένη «περιοχή».
RPO/RTO: στόχος RPO ≤ 5 λεπτά, RTO ≤ 30 λεπτά· ελέγχει τακτικά.
10) SLO/SLI και ταμπλό
Ορόσημα (παράδειγμα):- p95 'authorize/debit/credit' <150-300 ms (εσωτερική διαδρομή).
- p95 end-to-end «bus komanda→sobytiye» <1-2 s.
- Παράδοση webhooks/εξωτερικών γεγονότων p99 <5 λεπτά.
- Απωλεσθείσες/διπλές συναλλαγές = 0 (έλεγχοι συμβάσεων).
Μετρήσεις: καθυστέρηση p50/p95/p99, ρυθμός σφάλματος (4xx/5xx/business), καθυστέρηση καταναλωτή/αναμονής, καταιγίδες επανάληψης, καθυστέρηση εγκατάστασης, καθυστέρηση webhook, μέγεθος DLQ, συχνότητα 'IDEMPOTENCY _ MISMATCH CH'.
11) Παρατηρησιμότητα και λογιστικός έλεγχος
Δομημένα αρχεία καταγραφής JSON με 'trace _ id', 'idempotency _ key', business ID, κωδικούς σφάλματος.
OpenTelemetry: HTTP/gRPC/DB/bus tracing, spans of sagas.
Έλεγχος WORM: αμετάβλητα αρχεία καταγραφής κρίσιμων αλλαγών (όρια, κλειδιά, ρυθμίσεις promo/τζάκποτ).
PII/μυστική κάλυψη, περιφερειακοί κουβάδες, RBAC/ABAC για πρόσβαση στο ημερολόγιο.
12) Δοκιμή αξιοπιστίας
Δοκιμές επί συμβάσει: επανάληψη/επανάληψη, εκτός τάξης, ιδεατότητα, αποσύνθεση.
Φορτίο: προφίλ αιχμής (x10), σταθερότητα των ουρών αναμονής και DB.
Περιπτώσεις χάους: σταγόνα (ledger )/σταγόνα πορτοφολιού, σταγόνα ουράς/περιοχή απόρριψης, καθυστερήσεις ΚΕΕΛΠΝΟ, «καταιγίδα»
Ημέρες παιχνιδιού: τακτικές ασκήσεις και περιστατικά DR, με μέτρηση MTTR.
13) Αποθήκευση και δεδομένα
OLTP για χρήματα: βάση δεδομένων συναλλαγών (RPO≈0), αυστηροί δείκτες, σειριακά επίπεδα για κρίσιμες οντότητες.
Cache (Redis) - μόνο για επιτάχυνση, όχι για "αλήθεια. "TTL + jitter, προστασία σφραγίδας.
OLAP/DWH - για εκθέσεις/αναλύσεις. Ροές από CDC/λεωφορείο, χωρίς φορτίο στο OLTP.
Τα σχήματα δεδομένων επαληθεύονται. μετάβαση χωρίς downtime (επέκταση/σύμβαση).
14) Ενορχήστρωση των Retraces
Εκθετική εφεδρεία + νευρικότητα, προθεσμίες/χρονοδιάγραμμα στο RPC.
Idempotent επανάληψη σε κάθε στρώμα (υπηρεσία πελάτη καταναλωτή).
Ποσοστώσεις ρετράι, προστασία από «καταιγίδες» (διακόπτης κυκλώματος, αντισταθμιζόμενες αιτήσεις, κατά περίπτωση).
Επανάληψη από το DLQ μόνο σε «ασφαλή» παράθυρα, με όριο ταχύτητας.
15) Ασφάλεια των μεταφορών
mTLS παντού S2S, βραχύβιες μάρκες (OAuth2 CC), υπογραφές σώματος (HMAC/EdDSA) για webhooks.
Μυστικά στο θησαυροφυλάκιο/HSM, περιστροφή, κλειδιά ανά εμπορικό σήμα/περιοχή.
Οι πολιτικοί έχουν το μικρότερο προνόμιο, «τέσσερα μάτια» στις χειρωνακτικές λειτουργίες.
16) Δειγματοληπτικές συμβάσεις (θραύσματα)
Idempotent Εντολή χρέωσης
POST/v1/πορτοφόλι/χρέωση
Κεφαλίδες: X-Idempotency-Key: debit_pi_001, X-Trace-Id: tr_a1b2
{
« » «ποσό «: {«minor _ units «: 5000», νόμισμα»:» EUR»} «, λόγος «:» payou », « »
}
200 {«κατάσταση «: «δεσμευμένη», « »}
(επαναλάβετε → ίδια απάντηση)Εκδήλωση από το outbox
json
{
"event_id":"uuid," "event_type":"wallet. χρεωστική. δεσμευμένο «» occurred_at":"2025-10-23T16:21:05Z, «» account_id":"acc_42, «» amount_minor":5000 «, νόμισμα»: «EUR», «reference_id":"po_001,» «idempotency_key":"debit_pi_001,» schema_version":"1. 3. 0"
}17) Κατάλογοι ελέγχου
Πλατφόρμα/Φορέας εκμετάλλευσης
- Αληθινό ισοζύγιο - ένα βιβλίο; δεν υπάρχουν εργασίες.
- Όλες οι πράξεις εγγραφής με 'Idempotency-Key'. αποθηκεύεται η κύρια απόκριση.
- Outbox/CDC σε όλα τα domain records, DLQ και διαχείριση replay.
- Ουρές προτεραιότητας, αντίθλιψη, τρόποι υποβάθμισης.
- Τα κλειδιά κατάτμησης επιλέγονται από τα κλειδιά εργασίας. οι καταναλωτές είναι ευφυείς.
- Ταμπλό SLO, OpenTelemetry, έλεγχος WORM.
- Τακτικές ασκήσεις DR/xaoc, δοκιμές σύμβασης/φορτίου.
- Κατοικία δεδομένων, κρυπτογράφηση, θησαυροφυλάκιο/HSM, περιστροφή κλειδιού.
Πάροχοι/Ενοποιήσεις
- Αποστολή Trace-Id/Idempotency-Key, έτοιμη για ανακατανομή.
- Webhooks είναι υπογεγραμμένα και dedupliced.
- Τηρούνται οι εκδόσεις των συστημάτων/συμβάσεων (semper, decretation).
18) Κόκκινες σημαίες (αντίγραφα)
Η ισορροπία αλλάζει με webhook χωρίς εντολή στο Ledger.
Έλλειψη ευελιξίας → διπλές διαγραφές/πιστώσεις.
Εκδοτικές εκδηλώσεις που παρακάμπτουν το outbox/CDC.
Μονόλιθ χωρίς οπισθοδρόμηση: η κορύφωση της κυκλοφορίας μειώνει τα πάντα.
Αναμειγνύοντας την OLTP και αναφορές: Η BI χτυπά τη βάση δεδομένων μάχης.
Απουσία DLQ/επανάληψη «αθόρυβη» κατάποση σφαλμάτων.
Καμία περιφερειακή απομόνωση PII/χρήματος. κοινά κλειδιά σε πολλαπλές μάρκες.
Χειροκίνητες επεξεργασίες ισοζυγίων/καταστάσεων στη βάση δεδομένων.
19) Η τελική γραμμή
Η ασφαλής επεξεργασία εκατομμυρίων συναλλαγών την ημέρα είναι για τις αναλλοίωτες και την πειθαρχία: μια μοναδική πηγή αλήθειας, ευφυείς εντολές, sagas και outbox/CDC, τάξη και νεκρό σε ουρές, παρατηρησιμότητα και διαχείριση της υποβάθμισης. Προσθέστε εντολές πρόσβασης, πρακτικές DR και τακτικές ασκήσεις - και αποκτήστε ένα σύστημα όπου τα χρήματα κινούνται γρήγορα και μόνο μία φορά, τα γεγονότα δεν χάνονται, και η αύξηση της κυκλοφορίας και οι διαταραχές γίνονται διαχειρίσιμοι κίνδυνοι, δεν προκαλεί έκπληξη.
