Logo GH

DDD im iGaming-Kern

Die iGaming-Plattform ist ein komplexes Domain-System an der Schnittstelle von Finanzen, Unterhaltung und Compliance. DDD hilft, Komplexität zu halten: Es hebt bounded contexts hervor, erfasst ubiquitous language, schützt Invarianten mit Aggregaten, vereinfacht Integrationen durch Anti-Korruptions-Schichten und macht das Systemverhalten durch Domain-Events transparent.

1) Domainkarte und bounded contexts (strategisches Design)

Empfohlene Zerlegung:
  • Player/KYC Context - Registrierung, Verifizierung, Grenzen für verantwortungsvolles Spielen, KYC/AML-Status.
  • Wallet/Ledger Context - Bilanzen, Reservierungen, Buchungen, Multi-Currency, Kurse.
  • Betting Context - Gebote/Tickets, Paar/Ergebnisse, Angebote, Abrechnung (settlement), Stornierung.
  • Casino/Game Round Context - Sessions, Runden, Spins, RTP-Kontrolle, Einsatzlimits.
  • Bonus/Promo-Kontext - Bonusregeln, Vager, Erwerb von Bonusgeldern, Anti-Missbrauch.
  • Risiko/Betrug Kontext - Scoring, Verhaltenssignale, Auslöser von Sperren/Timeouts.
  • Zahlungskontext - Ein-/Auszahlungen, Status von Zahlungsgateways, Chargeback-Ereignisse.
  • Compliance/Berichtskontext - Berichte an Aufsichtsbehörden, Sanktionslisten, Audit.
  • Content/Provider Integration Context - Integration mit Spieleanbietern, Katalogen, Technik. Status.
  • Analytics/Read Models - Projektionen und Vitrinen für Produktlesungen.
💡 Intertextuelle Kommunikation - durch Domänenereignisse und asynchrone Befehle; synchrone Anrufe - nur dort, wo es sich wirklich um einen Domain-Vertrag handelt und eine strikte Konsistenz erforderlich ist.

2) Ubiquitous Sprache: der Kern der Begriffe

Spieler (Spieler), Session (Session), GameRound (Runde), Wette/Ticket (Wette),

Ledger Entry, Hold/Reserve, Settlement,

Bonus Credit / Bonus Balance, Wagering Requirement (Вейджер),

KYC Tier, Limit (Einzahlung/Sitzung/Verlust), Selbstausschluss,

Provider Game, RTP Window, Risk Flag, Compliance Case.

Diese Namen werden gleichermaßen in Code, DB, Dokumentation, Tests und Schnittstellen verwendet.

3) Aggregate und Invarianten (taktisches Design)

3. 1 Wallet (Aggregate: `Wallet`)

Invarianten:
  • Die Bilanz geht nicht ins Minus.
  • Reserve + verfügbar ≤ Gesamtbilanz.
  • Die Verdrahtung ist atomar und idempotent (durch 'operation _ id').
Befehle/Ereignisse:
  • `Wallet. Reserve(amount, reason, op_id)` → `WalletReserved`
  • `Wallet. Commit(op_id)` → `WalletCommitted`
  • `Wallet. Rollback(op_id)` → `WalletRolledBack`

Grenze: Wallet weiß nichts über Bet/Bonus; es dient Transaktionen und Reserven.

3. 2 Bet/Ticket (Aggregate: `Bet`)

Invarianten:
  • Das Gebot kann nur im aktiven Angebotsfenster angenommen werden; Betrag des ≤ Limits des Spielers/der Sitzung.
  • Nach 'Settled' ist der Status' finalisiert'; Eine Neuberechnung ist nur durch Ausgleichsvorgänge (void/recalc) mit eindeutiger Prüfung zulässig.
Befehle/Ereignisse:
  • `Bet. Place(player_id, amount, price, op_id)` → `BetPlaced` (требует Wallet. Reserve)
  • `Bet. Settle (outcome, payout) '→' BetSettled'(erfordert Wallet. Commit/Release)
  • `Bet. Void(reason)` → `BetVoided`

Grenze: Bet „klettert“ nicht in Wallet - wird über Domain-Befehle/Orchestrierung angesprochen.

3. 3 GameRound (Aggregate: `Round`)

Invarianten:
  • Jeder Spin/jede Runde hat eine eindeutige' round _ id 'und einen zugehörigen Einsatz-/Gewinnbetrag.
  • Das RTP-Fenster überschreitet nicht die vorgegebenen Schwellenwerte (auf Anbieterebene + lokale Regeln).
Veranstaltungen:
  • `Round. Started`, `Round. Staked`, `Round. Resulted`, `Round. Closed`.

3. 4 Bonus (Aggregate: `BonusGrant`)

Invarianten:
  • Vager reduziert sich erst ab dem gültigen Umsatz, Bonusabbuchungen gehen nicht in die Belastung.
  • Es ist nicht möglich, den Bonus und das Echtgeld gleichzeitig nach einer anderen Prioritätsregel abzuschreiben.
Veranstaltungen:
  • `BonusGranted`, `BonusWagered`, `BonusExpired`, `BonusConverted`.

4) Orchestrationen, Sagas und Konsistenz

Synchron (CP): Wettannahme und Mittelreserve - ein einziger Weg: 'Bet. Place` → `Wallet. Reserve'(über Domain-Team/Orchestrator mit Deadline).
Asynchron (EC): Wettberechnung, Bonusberechnung, Analytik - durch Events + Outbox.
TCC-Variante: 'TryReserve' (hold), 'Confirm' (commit), 'Cancel' (rollback) für monetäre Effekte.
Idempotenz: Alle Teams tragen 'operation _ id', die Consumer 'inbox'.

5) Anti-Korruptions-Schichten (ACL) und Integrationen

Provider ACL: Übertragung der Provider-Events' SpinResult', 'BonusWin' in die interne' Runde. Resulted`, `BonusWagered`. Diagramme und Versionen sind innerhalb der ACL.
PSP ACL: Normalisierung des Zahlungsstatus, Idempotenz durch „psp _ tx _ id“, Übersetzung in „LedgerEntry“.
Compliance ACL: Integration mit Sanktionslisten/PER - im externen Kontext; innerhalb der Domain gelangen nur normalisierte' ScreeningUpdated'.

Regel: Externe Wörterbücher/Formate „sickern“ nicht in den Kernel.

6) Projektionen und Lesemodelle

Spielerprofil Lesemodell: KYC-Status, Limits, aktive Boni, frische Transaktionen.
Balances Read Model: Schnelle Lesungen für UI/Marketing; Quelle ist 'Wallet' des Ereignisses.
Bet History Read Model: Paginierung nach Datum/Spiel; Quelle ist „BetPlaced/Settled“.
Compliance Reports: materialisierte Ansichten nach Tenant/Region.

Alle Projektionen sind idempotente upsert's mit Versionierung und 'as _ of/freshness'.

7) Multi-Tenant und Multi-Region

Alle Schlüsseleinheiten tragen 'tenant _ id' und (falls erforderlich) 'region'.
Datengrenzen: Spieler, Brieftasche, Wetten - „Home“ -Region; regionalübergreifend nur Aggregate/Berichte.
Fairness/Quoten: Limits pro Team/sec und Redraves pro Tenant.
Residency/Compliance: Personenbezogene Daten und Buchungen verlassen die Region nicht.

8) Konsistenzauswahl (PACELC) nach Kontext

Wallet/Ledger - Strong/CP: Linearisierte Buchungen, Quorum der Einträge.
Bet acceptance - Synchrone Bestätigung (CP) + schnelle Lesemodelle für die Benutzeroberfläche.
Siedlung/Bonus/Analytics - EC mit deterministischer Merge/Kompensation.
KYC/Compliance - kann ein EC für Status sein, aber „blockierende“ Regeln werden synchron angewendet.

9) Domain-Events: Verträge und Version

Minimaler Feldsatz:
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"
}
Regeln:
  • Back/forward-compat Schemata; Evolution durch „schema _ version“.
  • 'outbox' in einer Transaktion mit Domänenänderungen; Veröffentlichung von Battles mit Backoff.

10) Beispiel-Stream „Wetten mit Bonus“ (verbale Sequenz)

1. `Bet. Place'(Team) → Überprüfung der Spielerlimits und der → 'Wallet Bonusregeln. Reserve(real+bonus_equiv, op_id)`

2. 'BetPlaced' (Ereignis) → Read Model aktualisiert 'Offene Wetten'

3. Der Anbieter veröffentlicht das Ergebnis → ACL → 'Round. Resulted`

4. Der Orchestrator rechnet: 'Bet. Settle(outcome,payout)` → `Wallet. Commit (op_id) 'und, wenn Sie gewinnen,' BonusWagered '→ eine mögliche Umwandlung des Bonus in real.
5. 'BetSettled' → Projektionen der Geschichte und Bilanzen, Berichterstattung.

11) Invarianten und Testrichtlinien

Schlüsselinvarianten:
  • Die Summe aller 'LedgerEntry' auf der Brieftasche ist gleich dem Saldo; keine negativen Rückstände.
  • Sie können bei aktivem Selbstausschluss/eingefrorenem KYC-Status keine Wette annehmen.
  • Vager kann nur abnehmen und nicht „im Minus“ schwingen.
  • Settlement ändert nichts am Status der bereits finalisierten Wette - nur durch 'Void/Recalc' + Kompensationsbuchung.
Prüfung:
  • Eigenschaftsbasierte Tests von Wallet-Invarianten und Wetten.
  • Die Konturen des Chaos: Provider-Verzögerungen, PSP-Ausfälle, Outbox/DLQ-Redrives.
  • Schemasteuerung: Ereignismigrationen, Backfill-Projektionen.

12) Telemetrie und Audit

Metriken: p95/p99 auf PlaceBet/Reserve/Commit, Ausfallanteil nach Limits/CUS, DLQ-Rate, Redrive-Erfolg, Lag-Projektionen.
Tracing: Spans von „komanda→agregat→outbox→konsyumer→proyektsiya“, Tags von „tenant _ id“, „operation _ id“, „saga _ id“.
Audit: Unveränderliches Protokoll von Domänenaktivitäten, vergleichbar mit regulatorischen Anforderungen.

13) Speicherschema (vereinfacht)

Wallet:

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:

bet(id, tenant_id, player_id, amount, price, status, placed_at, settled_at, operation_id)
Bonus:

bonus_grant(id, tenant_id, player_id, amount, wager_left, status, expires_at)

Die Versionierung auf Aggregaten ('version') schützt vor verlorener Aktualisierung bei kompetitiver Aufzeichnung.

14) Beispielbefehle API (Pseudo)

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":"..." }

Alle Befehle sind mit 'operation _ id' für idempotence, die Antworten sind mit 'as _ of '/' version'.

15) Sicherheit und Compliance

RLS/ACL: alle Anfragen - im Kontext 'tenant _ id', Zugriff nach Rolle.
PII-Minimierung: Trennung von Domain-Events von personenbezogenen Daten; Maskierung in DLQ/Logs.
Regulatorische Berichte: Projektionen mit unveränderlichen Hash-Signaturen durch Zeitfenster.

16) Typische Fehler

Starke Konnektivität zwischen Kontexten (Wallet kennt Bet/Bonus direkt).
Dual-Write in verschiedene Kontexte ohne Sagen/Outbox → Fehlausrichtung von Salden und Status.
Keine Idempotenz von Teams und Konsumenten → Doppelbuchungen/Abrechnungen.
Der Fluss von Anbieterverträgen in das Domänenmodell (schwieriger zu migrieren).
Ein „gigantisches“ Gerät (der Player enthält alles) → Sperren, niedrige Durchgänge.
Es gibt keine offensichtlichen Invarianten - sie können nicht überprüft und überwacht werden.

17) Schnelle Rezepte

Start: Fixieren Sie Ubiquitous Language und Kontextgrenzen; Invarianten dokumentieren.
Geld: Wallet/Ledger - CP, Quorum Records, TCC für externe Effekte.
Preise: synchroner Empfang + asynchrone Berechnung, alles durch Ereignisse und Outbox; Idempotenz ist überall.
Boni: separate Einheit mit klarer Priorität für Abschreibungen und Vager.
Integrationen: immer über ACL + Schemen/Versionen; keine „Rohstoff“ payload's im Kern.
Lesungen: Projektionen/Schaufenster auf die Bedürfnisse des Produkts; SLA Frische + „as _ of“.
Betrieb: Invarianten Metriken, DLQ/redrive Playbooks, rebuild Vitrinen.

18) Checkliste vor dem Verkauf

  • Bounded Contexts und ihre Verträge (Teams/Events) sind definiert.
  • Aggregate haben explizite Invarianten, Versionierung und idempotente Befehle.
  • Geldtransaktionen - durch TCC/strikte Transaktionalität; Audit ist aktiviert.
  • Integrationen - über ACL mit Schaltungsversionierung und Evolutionstests.
  • Outbox/Inbox, DLQ und Secure Redrive implementiert.
  • Projektionen implementieren SLA Frische, es gibt lag/staleness Metriken.
  • Multi-Tenant-Quoten/-Limits und Datenresidenz werden eingehalten.
  • Beobachtbarkeit: Tracing „komanda→sobytiye→proyektsiya“, Alerts durch Invarianten.
  • Dokumentation: Domänensprache, Kontextdiagramme, Incident Playbooks.

Schlussfolgerung

DDD im iGaming-Kern ist eine Disziplin der Komplexitätsteilung: klare Grenzen von Kontexten, Aggregate mit Invarianten, Ereignisse als Quelle der Wahrheit, ACLs für externe Integrationen und bewusste Konsistenzentscheidungen. Dieser Ansatz macht die Plattform skalierbar, zuverlässig und Compliance-konform, beschleunigt die Entwicklung und reduziert die operativen Risiken - selbst bei einem schnellen Wachstum von Traffic, Geografien und Produktlinien.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.