DDD στον πυρήνα iGaming
Η πλατφόρμα iGaming είναι ένα πολύπλοκο σύστημα τομέα στη διασταύρωση της χρηματοδότησης, της ψυχαγωγίας και της συμμόρφωσης. Το DDD βοηθά στη διατήρηση της πολυπλοκότητας: αναδεικνύει τα οριοθετημένα πλαίσια, συλλαμβάνει την πανταχού παρούσα γλώσσα, προστατεύει τις αναλλοίωτες με συγκεντρωτικά στοιχεία, απλοποιεί τις ενοποιήσεις μέσω στρωμάτων κατά της διαφθοράς και καθιστά τη συμπεριφορά του συστήματος διαφανή μέσω γεγονότων πεδίου.
1) Χάρτης τομέα και οριοθετημένα πλαίσια (στρατηγικός σχεδιασμός)
Συνιστώμενη αποσύνθεση:- Πλαίσιο παίκτη/KYC - εγγραφή, επαλήθευση, όρια υπεύθυνου παιχνιδιού, καταστάσεις KYC/AML.
- Πλαίσιο πορτοφολιών/λογιστικών βιβλίων - υπόλοιπα, κρατήσεις, συναλλαγές, πολλαπλά νομίσματα, συναλλαγματικές ισοτιμίες.
- Πλαίσιο στοιχημάτων - στοιχήματα/εισιτήρια, ζεύγη/αποτελέσματα, εισαγωγικά, διακανονισμός, ακύρωση.
- Casino/Game Round Context - συνεδρίες, γύροι, πλάτες, έλεγχος RTP, όρια στοιχημάτων.
- Bonus/Promo Πλαίσιο - κανόνες πριμοδότησης, στοιχήματα, απόκτηση αμοιβαίων κεφαλαίων, καταπολέμηση της κατάχρησης.
- Πλαίσιο κινδύνου/απάτης - βαθμολόγηση, σήματα συμπεριφοράς, ενεργοποιήσεις κλεισίματος/χρονισμού.
- Πλαίσιο πληρωμών - καταθέσεις/αναλήψεις, καταστάσεις πύλης πληρωμής, γεγονότα χρέωσης.
- Πλαίσιο συμμόρφωσης/υποβολής εκθέσεων - εκθέσεις προς τις ρυθμιστικές αρχές, καταλόγους κυρώσεων, λογιστικοί έλεγχοι.
- Πλαίσιο ενσωμάτωσης περιεχομένου/παρόχου - ενσωμάτωση με παρόχους παιχνιδιών, καταλόγους, τεχνολογία. καταστάσεις.
- Analytics/Read Models - προβολές και προβολές για αναγνώσεις προϊόντων.
2) Πανταχού παρούσα γλώσσα: ο πυρήνας των όρων
Παίκτης, συνεδρία, γύρος παιχνιδιού, στοίχημα/εισιτήριο,
Λογιστική καταχώριση, κατοχή/αποθεματικό, διακανονισμός,
Bonus Credit/Bonus Reserve, Wagering Requirement (Вейджер),
Βαθμίδα KYC, Όριο (κατάθεση/συνεδρία/απώλεια), Αυτοαποκλεισμός,
Παιχνίδι παρόχου, παράθυρο RTP, σημαία κινδύνου, περίπτωση συμμόρφωσης.
Οι ονομασίες αυτές χρησιμοποιούνται εξίσου σε κωδικό, βάση δεδομένων, τεκμηρίωση, δοκιμές και διεπαφές.
3) Συγκεντρωτικά μεγέθη και αναλλοίωτες (τακτικός σχεδιασμός)
3. 1 Πορτοφόλι (Σύνολο: «Πορτοφόλι»)
Αναλλοίωτες:- Το υπόλοιπο δεν εισέρχεται σε αρνητικό έδαφος.
- Αποθεματικό + διαθέσιμο ≤ συνολικό υπόλοιπο.
- Η καλωδίωση είναι ατομική και ευδιάκριτη (με 'λειτουργία _ id').
- 'Πορτοφόλι. Αποθεματικό (ποσό, λόγος, op_id) '→' WalletReserved '
- 'Πορτοφόλι. Κοινοποίηση (op_id) '→' WalletCommittee '
- 'Πορτοφόλι. Rollback (op_id) '→' WalletRolledBack '
Σύνορα: Το πορτοφόλι δεν γνωρίζει για το στοίχημα/μπόνους. εξυπηρετεί συναλλαγές απόσπασης και αποθεματικών.
3. 2 Στοίχημα/Εισιτήριο (Σύνολο: 'Στοίχημα')
Αναλλοίωτες:- Ο συντελεστής μπορεί να γίνει δεκτός μόνο στην ενεργό θυρίδα διαμόρφωσης τιμών· Ποσό ορίου παίκτη/συνεδρίας.
- Μετά το 'Settled', το καθεστώς είναι 'οριστικοποιημένο'. ο επανυπολογισμός επιτρέπεται μόνο μέσω αντισταθμιστικών πράξεων (κενές/επαναληπτικές) με σαφή έλεγχο.
- 'Στοίχημα. Τόπος (player_id, ποσό, τιμή, op_id) '→' BetPlaced '(πορτοφόλι требует. Αποθεματικό)
- 'Στοίχημα. Διακανονισμός (αποτέλεσμα, πληρωμή) '→' BetSettled '(απαιτεί πορτοφόλι. Commit/Release)
- 'Στοίχημα. Κενό (λόγος) '→' BetVoided '
Σύνορο: Το στοίχημα δεν «ανεβαίνει» στο πορτοφόλι - καλεί μέσω εντολών/ενορχήστρωσης τομέα.
3. 3 Γύρος παιχνιδιού (Σύνολο: 'Γύρος')
Αναλλοίωτες:- Κάθε περιστροφή/γύρος έχει ένα μοναδικό 'round _ id' και ένα σχετικό ποσό στοιχήματος/νίκης.
- Το παράθυρο RTP δεν υπερβαίνει τα καθορισμένα κατώτατα όρια (σε επίπεδο παρόχου + τοπικούς κανόνες).
- 'Στρογγυλό. Ξεκίνησε ',' Round. Staked ',' Round. Αποτέλεσμα ',' Γύρος. Κλειστό '.
3. 4 Πριμοδότηση (σύνολο: «BonusGrant»)
Αναλλοίωτες:- Το vager μειώνεται μόνο από τον έγκυρο κύκλο εργασιών, οι διαγραφές μπόνους δεν χρεώνονται.
- Δεν είναι δυνατόν να διαγραφεί η πριμοδότηση και τα πραγματικά κεφάλαια ταυτόχρονα όχι σύμφωνα με τον κανόνα προτεραιότητας.
- 'BonusGranted', 'BonusWagered', 'BonusExpired', 'BonusConverted'.
4) Ενορχηστρώσεις, σάγκα και συνοχή
Συγχρονισμένη (CP): αποδοχή στοιχημάτων και αποθεματικών κεφαλαίων - ένας τρόπος: "Στοίχημα. Τοποθέτηση πορτοφολιού '→'. Αποθεματικό "(μέσω ομάδας/ενορχηστρωτή τομέα με προθεσμία).
Ασύγχρονη (EC): υπολογισμός επιτοκίου, προσαύξηση, ανάλυση - μέσω γεγονότων + outbox.
Παραλλαγή TCC: ' Reserve' (hold), 'Επιβεβαίωση' (commit), 'Ακύρωση' (rollback) για νομισματικά αποτελέσματα.
Ταυτότητα: όλες οι εντολές φέρουν "λειτουργία _ i , καταναλωτές -" εισερχόμενα ".
5) Στρώματα καταπολέμησης της διαφθοράς (ACL) και ενοποιήσεις
Πάροχος ACL: μετάφραση των εκδηλώσεων του παρόχου 'SpinResult', 'BonusWin' to internal 'Round. Αποτέλεσμα ',' BonusWagered '. Τα σχήματα και οι εκδόσεις είναι μέσα στο ACL.
PSP ACL: ομαλοποίηση των καταστάσεων πληρωμών, ταυτότητα με 'psp _ tx _ id', μεταφορά στο 'LedgerEntry'.
ACL συμμόρφωσης: ενσωμάτωση στους καταλόγους κυρώσεων/RAP - σε εξωτερικό πλαίσιο· μόνο το κανονικοποιημένο 'ScreetingUpdate' μπαίνει μέσα στον τομέα.
Κανόνας: εξωτερικά λεξικά/μορφότυποι δεν «διαρρέουν» στον πυρήνα.
6) Προβολές και μοντέλα ανάγνωσης
Μοντέλο ανάγνωσης προφίλ παίκτη: καταστάσεις KYC, όρια, ενεργά μπόνους, νέες συναλλαγές.
Balances Read Model: Fast Reads for UI/Marketing; Πηγή - «Πορτοφόλι».
Bet History Read Model: Pagination by Date/Game; Πηγή: 'BetPlaced/Settled'.
Εκθέσεις συμμόρφωσης - Πραγματικές απόψεις ανά ενοικιαστή/περιφέρεια.
Όλες οι προβολές είναι idempotent upserts με έκδοση και 'as _ of/freshness'.
7) Πολυκατοικίες και πολυπεριφέρειες
Όλες οι βασικές οντότητες φέρουν τον όρο «ενοικιαστής _ id» και (εάν είναι απαραίτητο) τον όρο «περιφέρεια».
Όρια δεδομένων: παίκτης, πορτοφόλι, στοιχήματα - περιοχή «σπίτι». μόνο διαπεριφερειακά συγκεντρωτικά στοιχεία/εκθέσεις.
Δίκαιος χαρακτήρας/ποσοστώσεις: όρια για τις ομάδες/sec και redrives για τους ενοικιαστές.
Κατοικία/συμμόρφωση: προσωπικά δεδομένα και συναλλαγές δεν εγκαταλείπουν την περιοχή.
8) Επιλογή συνέπειας (PACELC) ανά πλαίσιο
Πορτοφόλι/Βιβλίο - Strong/CP: γραμμικές συναλλαγές, απαρτία εγγραφών.
Αποδοχή στοιχήματος - σύγχρονη επιβεβαίωση (CP) + μοντέλα ταχείας ανάγνωσης για UI.
Διακανονισμός/Bonus/Analytics - ΕΚ με καθοριστική συγχώνευση/αποζημίωση.
KYC/Συμμόρφωση - μπορεί να είναι ΕΚ για καταστάσεις, αλλά οι κανόνες «εμπλοκής» εφαρμόζονται συγχρονισμένα.
9) Εκδηλώσεις τομέα: Συμβάσεις και έκδοση
Ελάχιστο σύνολο πεδίων:json
{
"event_id": "uuid",
"event_type": "BetPlaced",
"occurred_at": "timestamp",
"tenant_id": "T123",
"aggregate_id": "BET-...-UUID",
"version": 7,
"payload": { "...domain fields..." },
"schema_version": "v3"
}
Κανόνες:
- συστήματα back/forward compat· εξέλιξη μέσω 'schema _ version'.
- 'outbox' in μια συναλλαγή με αλλαγές τομέα· δημοσίευση με πλήκτρα με εφεδρικό.
10) Παράδειγμα ροής «Bet with Bonus» (ακολουθία λέξεων)
1. 'Στοίχημα. Θέση '(ομάδα) → έλεγχος ορίων παικτών και →' κανόνες μπόνους πορτοφολιού. Αποθεματικό (real + bonus _ equiv, op_id) '
2. 'BetPosited' → Read Model updates 'Open Wagers'
3. Ο πάροχος δημοσιεύει το αποτέλεσμα → Γύρου ACL των →. Αποτέλεσμα "
4. Ο ενορχηστρωτής υπολογίζει: 'Στοίχημα. Διακανονισμός (αποτέλεσμα, πληρωμή) '→' πορτοφόλι. Commit (op_id) 'και, αν κερδηθεί,' BonusWagered '→ μια πιθανή μετατροπή του bonus σε πραγματικά.
5. «BetSettled» → προβολές της ιστορίας και των ισολογισμών, υποβολή εκθέσεων.
11) Αναλλοίωτες και πολιτική δοκιμών
Βασικές αναλλοίωτες:- Το άθροισμα όλων των «LedgerEntry» στο πορτοφόλι ισούται με το υπόλοιπο· δεν υπάρχουν αρνητικά υπολείμματα.
- Δεν μπορείτε να δεχθείτε ένα στοίχημα με ενεργό αυτο-αποκλεισμό/παγωμένο καθεστώς KYC.
- Το στοίχημα μπορεί μόνο να μειωθεί και όχι να ταλαντεύεται «σε μείον».
- Ο διακανονισμός δεν μεταβάλλει την κατάσταση του ήδη οριστικοποιημένου επιτοκίου - μόνο μέσω της συναλλαγής «Void/Recalc» + της συναλλαγής συμψηφισμού.
- Δοκιμές με βάση ιδιότητες αναλλοίωτων πορτοφολιών και στοιχημάτων.
- Περίγραμμα του χάους: καθυστερήσεις παρόχου, αστοχίες PSP, outbox/DLQ redrives.
- Έλεγχος σχήματος: μετανάστευση γεγονότων, προβολές οπισθοπλήρωσης.
12) Τηλεμετρία και έλεγχος
Μετρήσεις: p95/p99 στο PlayBet/Reserve/Commit, μερίδιο αποτυχιών κατά όρια/ACC, ρυθμός DLQ, redrive επιτυχία, lag προβολές.
Εντοπισμός: εκτάσεις « », ετικέτες 'ενοικιαστής _ i ,' επιχείρηση _ id ',' saga _ id '.
Έλεγχος: ένα αμετάβλητο αρχείο δραστηριοτήτων τομέα συγκρίσιμο με τις κανονιστικές απαιτήσεις.
13) Καθεστώς αποθεματοποίησης (απλουστευμένο)
Πορτοφόλι:
wallet(id, tenant_id, currency, balance, reserved, version)
ledger(id, wallet_id, amount, type, operation_id, occurred_at)
holds(id, wallet_id, amount, operation_id, expires_at, status)
Στοίχημα:
bet(id, tenant_id, player_id, amount, price, status, placed_at, settled_at, operation_id)
Πριμοδότηση:
bonus_grant(id, tenant_id, player_id, amount, wager_left, status, expires_at)
Η έκδοση των συγκεντρωτικών μεγεθών («έκδοση») θα προστατεύει από την απώλεια επικαιροποίησης κατά τη διάρκεια της ανταγωνιστικής καταγραφής.
14) Παράδειγμα εντολής API (ψευδο)
http
POST /bets. place
{
"tenant_id":"T1",
"player_id":"P42",
"amount":"10. 00",
"price":"2. 1",
"operation_id":"op-uuid",
"context":{"game_id":"g777","channel":"web"}
}
→ 202 Accepted + BetPlaced
POST /wallets. reserve
{ "wallet_id":"W1", "amount":"10. 00", "operation_id":"op-uuid", "reason":"bet" }
→ 200 { "reserved_balance":"..." }
Όλες οι εντολές είναι με 'λειτουργία _ id' για idempotency, οι απαντήσεις είναι με 'as _ of '/' version'.
15) Ασφάλεια και συμμόρφωση
RLS/ACL: όλα τα αιτήματα - στο πλαίσιο του 'tenant _ id', πρόσβαση ανά ρόλο.
ελαχιστοποίηση των PII: διαχωρισμός των γεγονότων τομέα από τα προσωπικά δεδομένα· κάλυψη σε DLQ/κούτσουρα.
Κανονιστικές εκθέσεις: προβλέψεις με αμετάβλητες υπογραφές hash σε χρονικά παράθυρα.
16) Τυπικά σφάλματα
Ισχυρή συνδεσιμότητα μεταξύ των πλαισίων (το πορτοφόλι γνωρίζει άμεσα το στοίχημα/μπόνους).
Διπλή γραφή σε διαφορετικά πλαίσια χωρίς sagas/outbox → αναντιστοιχία ισορροπιών και καταστάσεων.
Έλλειψη εντολής και ευελιξία των καταναλωτών → διπλασιασμός των συναλλαγών/υπολογισμών.
Η ροή των συμβάσεων παροχής υπηρεσιών στο μοντέλο τομέα (είναι δυσκολότερη η μετάβαση).
Ένα «γιγαντιαίο» σύνολο (Player περιλαμβάνει όλα) κλείδωμα →, χαμηλή απόδοση.
Δεν υπάρχουν προφανείς ανισότητες - δεν μπορούν να ελεγχθούν και να ελεγχθούν.
17) Γρήγορες συνταγές
Έναρξη: καθορισμός ορίων πανταχού παρούσας γλώσσας και πλαισίου. αναλλοίωτες εγγράφων.
Χρήμα: Πορτοφόλι/Βιβλίο - CP, καταχωρήσεις απαρτίας, TCC για εξωτερικά αποτελέσματα.
Στοιχήματα: συγχρονισμένη λήψη + ασύγχρονος υπολογισμός, όλα μέσω γεγονότων και outbox. idempotency είναι παντού.
Μπόνους: χωριστή μονάδα με σαφή προτεραιότητα διαγραφών και βάδισμα.
Ολοκλήρωση: πάντα μέσω συστημάτων/εκδόσεων ACL +· δεν υπάρχουν «ακατέργαστα» ωφέλιμα φορτία στον πυρήνα.
Ενδείξεις: προβολές/οθόνες για τις ανάγκες του προϊόντος. SLA φρεσκάδα + 'as _ of'.
Λειτουργία: μετρήσεις αναλλοίωτων, DLQ/redrave playbooks, ανακατασκευή εκθέσεων.
18) Κατάλογος ελέγχου πριν από την πώληση
- Καθορίζονται οριοθετημένα πλαίσια και οι συμβάσεις τους (εντολές/γεγονότα).
- Τα συγκεντρωτικά μεγέθη έχουν σαφείς αναλλοίωτες, εκδόσεις και εικονικές εντολές.
- Νομισματικές συναλλαγές - μέσω TCC/αυστηρής συναλλαγής. Ενεργοποιήθηκε ο λογιστικός έλεγχος.
- Ολοκλήρωση - μέσω ACL με δοκιμές έκδοσης σχημάτων και εξέλιξης.
- Εφαρμόστηκε outbox/inbox, DLQ και ασφαλές redraw.
- Οι προβολές εφαρμόζουν φρεσκάδα SLA, υπάρχουν μετρήσεις καθυστέρησης/στασιμότητας.
- Τηρούνται οι ποσοστώσεις/όρια για τους πολυκατοικούντες και τα στοιχεία διαμονής.
- Παρατηρησιμότητα: ανίχνευση «komanda→sobytiye→proyektsiya», καταχωρίσεις από αναλλοίωτους.
- Τεκμηρίωση: γλώσσα τομέα, διαγράμματα πλαισίου, βιβλία αναπαραγωγής συμβάντων.
Συμπέρασμα
Το DDD στον πυρήνα iGaming είναι μια πειθαρχία διαχωρισμού της πολυπλοκότητας: σαφή όρια πλαισίου, συγκεντρωτικά μεγέθη με αμετάβλητα, γεγονότα ως πηγή αλήθειας, ACL για εξωτερικές ενοποιήσεις και ενημερωμένες επιλογές συνέπειας. Η προσέγγιση αυτή καθιστά την πλατφόρμα κλιμακωτή, αξιόπιστη και σύμφωνη με τους κανονισμούς, επιταχύνει την ανάπτυξη χαρακτηριστικών και μειώνει τους λειτουργικούς κινδύνους - ακόμη και με την ταχεία αύξηση της κυκλοφορίας, των γεωγραφικών περιοχών και των γραμμών προϊόντων.