iGaming ýadrosynda DDD
iGaming-platforma - maliýe, güýmenje we laýyklygyň çatrygynda çylşyrymly domen ulgamy. DDD çylşyrymlylygy saklamaga kömek edýär: bounded contexts, ubiquitous language kesgitleýär, invariantlary agregatlar bilen goraýar, korrupsiýa garşy gatlaklaryň üsti bilen integrasiýany aňsatlaşdyrýar we domen wakalary arkaly ulgamyň özüni alyp barşyny aç-açan edýär.
1) Domen kartoçkasy we bounded contexts (strategiki dizaýn)
Maslahat berilýän dekompozisiýa:- Player/KYC Context - hasaba almak, tassyklamak, jogapkär oýnuň çäkleri, KYC/AML statuslary.
- Wallet/Ledger Context - balanslar, ätiýaçlyklar, simler, köp walýuta, kurslar.
- Betting Context - nyrhlar/biletler, jübüt/netijeler, sitatalar, hasaplaşyk (settlement), ýatyryş.
- Casino/Game Round Context - sessiýalar, tapgyrlar, arkalar, RTP-gözegçilik, stawka çäkleri.
- Bonus/Promo Context - bonuslaryň düzgünleri, wager, bonus serişdeleriniň ekwairingleri, hyýanatçylyga garşy.
- Töwekgelçilik/Fraud Context - skoring, özüňi alyp barşyň signallary, blokirlemeleriň/taým-autlaryň triggerleri.
- Payments Context - goýumlar/netijeler, töleg şlýuzlarynyň ýagdaýlary, çargeback-wakalar.
- Compliance/Reporting Context - düzgünleşdirijilere hasabat, sanksiýa sanawlary, audit.
- Content/Provider Integration Context - oýun, katalog, tehniki üpjün edijiler bilen integrasiýa. statuslar.
- Analytics/Read Models - azyk okamak üçin proýeksiýalar we penjireler.
2) Ubiquitous language: terminleriň özeni
Oýunçy, Session, GameRound, Bet/Ticket,
Ledger Entry (Geçiriş), Hold/Reserve (Ätiýaçlyk), Settlement (Hasaplama),
Bonus Credit / Bonus Balance, Wagering Requirement (Вейджер),
KYC Tier, Limit (depozit/sessiýa/ýitgiler), Öz-özüne mahsus,
Provider Game, RTP Window, Risk Flag, Compliance Case.
Bu atlar kodda, DB-de, resminamalarda, synaglarda we interfeýslerde birmeňzeş ulanylýar.
3) Agregatlar we inwariantlar (taktiki dizaýn)
3. 1 Wallet (Aggregate: `Wallet`)
Üýtgeşik:- Balans minusa gitmeýär.
- Ätiýaçlyk + elýeterli ≤ umumy balans.
- Atom we idempotent simleri ('operation _ id').
- `Wallet. Reserve(amount, reason, op_id)` → `WalletReserved`
- `Wallet. Commit(op_id)` → `WalletCommitted`
- `Wallet. Rollback(op_id)` → `WalletRolledBack`
Serhet: Wallet Bet/Bonus hakda bilmeýär; ol geçiriş we ätiýaçlyk amallaryna hyzmat edýär.
3. 2 Bet/Ticket (Aggregate: `Bet`)
Üýtgeşik:- Stawka diňe kotirowkalaryň işjeň penjiresinde kabul edilip bilner; oýunçynyň/sessiýanyň ≤ çäginiň möçberi.
- "Settled" statusyndan soň "gutardy"; gaýtadan hasaplamaga diňe anyk audit bilen öwezini dolmak amallary (void/recalc) arkaly ýol berilýär.
- `Bet. Place(player_id, amount, price, op_id)` → `BetPlaced` (требует Wallet. Reserve)
- `Bet. Settle (outcome, payout) '→' BetSettled '(Wallet talap edýär. Commit/Release)
- `Bet. Void(reason)` → `BetVoided`
Serhet: Bet Wallete "girmeýär" - domen buýruklary/orkestr arkaly habarlaşýar.
3. 3 GameRound (Aggregate: `Round`)
Üýtgeşik:- Her bir spin/tapgyrda özboluşly 'round _ id' we stawkanyň/ýeňşiň baglanyşykly mukdary bar.
- RTP penjiresi bellenen çäklerden geçmeýär (üpjün edijiniň derejesinde + ýerli düzgünler).
- `Round. Started`, `Round. Staked`, `Round. Resulted`, `Round. Closed`.
3. 4 Bonus (Aggregate: `BonusGrant`)
Üýtgeşik:- Weýjer diňe walid dolanyşygyndan azalýar, bonus hasapdan çykarylmagy debete gitmeýär.
- Bonusy we hakyky serişdeleri bir wagtyň özünde ileri tutulýan düzgün boýunça hasapdan çykarmak mümkin däl.
- `BonusGranted`, `BonusWagered`, `BonusExpired`, `BonusConverted`.
4) Orkestrler, saglar we sazlaşyk
Sinhron (CP): stawkany kabul etmek we serişde ätiýaçlygy - bir ýol: 'Bet. Place` → `Wallet. Reserve '(domen buýrugy/möhletli orkestrator arkaly).
Asinhron (EC): stawkany hasaplamak, bonuslary hasaplamak, analitika - wakalar + outbox arkaly.
TCC warianty: 'TryReserve' (hold), 'Confirm' (commit), 'Cancel' (rollback).
Idempotentlik: ähli toparlar 'operation _ id', konsumerler 'inbox' göterýärler.
5) Korrupsiýa garşy gatlaklar (ACL) we integrasiýa
Provider ACL: 'SpinResult', 'BonusWin' provayder wakalaryny içerki 'Roundda ýaýlyma bermek. Resulted`, `BonusWagered`. Shemalar we wersiýalar - ACL-iň içinde.
PSP ACL: töleg statuslarynyň kadalaşmagy, 'psp _ tx _ id', 'LedgerEntry' -e terjime edilmegi.
Compliance ACL: sanksiýalaryň sanawy bilen integrasiýa/PP - daşarky kontekstde; domeniň içine diňe kadaly "ScreeningUpdated" girýär.
Düzgün: daşarky sözlükler/formatlar ýadro içine "syzmaýar".
6) Proýeksiýalar we Read Models
Player Profile Read Model: KYC statuslary, çäklendirmeler, işjeň bonuslar, täze amallar.
Balances Read Model: UI/marketing üçin çalt okamak; "Wallet" hadysasynyň çeşmesi.
Bet History Read Model: seneler/oýunlar boýunça paginasiýa; Çeşme 'BetPlaced/Settled'.
Compliance Reports: tenant/sebit boýunça materiallaşdyrylan çykyşlar.
Proýeksiýalaryň hemmesi 'as _ of/freshness' wersiýasy bolan idempotent upsert '.
7) Köp tenant we köp sebit
Ähli esasy zatlar 'tenant _ id' we 'region' -y öz içine alýar.
Maglumatlaryň çäkleri: oýunçy, gapjyk, stawkalar - "öý" sebiti; kross-sebitleýin diňe agregatlar/hasabatlar.
Fairness/kwotalar: teams/sek çäkleri we tenantlar boýunça redraywler.
Residency/complayens: şahsy maglumatlar we geçirmeler sebitden çykmaýar.
8) Kontekstlere görä sazlaşygy saýlamak (PACELC)
Wallet/Ledger - Strong/CP: Lineirlenen simler, ýazgylaryň kworumy.
Bet acceptance - sinhron tassyklama (CP) + UI üçin çalt Read Models.
Settlement/Bonus/Analytics - kesgitlenen merge/kompensasiýa bilen EC.
KYC/Compliance - statuslar üçin EC bolup biler, ýöne "bloklaýjy" düzgünler sinhron ulanylýar.
9) Domen wakalary: şertnamalar we wersiýa
Iň az meýdan toplumy: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"
}
Düzgünler:
- Back/forward-compat shemalary; 'schema _ version' arkaly ewolýusiýa.
- 'outbox' domen üýtgemeleri bilen amallarda; backoff bilen çap etmek.
10) "Bonus bilen stawka" akymynyň mysaly (söz yzygiderliligi)
1. `Bet. Place '(topar) → oýunçynyň çäklerini we bonus düzgünlerini barlamak →' Wallet. Reserve(real+bonus_equiv, op_id)`
2. 'BetPlaced' (waka) → Read Model "Açyk nyrhlary" täzeleýär
3. Üpjün ediji netijäni çap edýär → ACL → 'Round. Resulted`
4. Orkestrator: 'Bet. Settle(outcome,payout)` → `Wallet. Commit (op_id) 'we, ýeňiş gazananyňyzda,' BonusWagered '→ bonusyň hakyky görnüşe öwrülip biljekdigi.
5. 'BetSettled' → taryhyň we balanslaryň proýeksiýalary, hasabat.
11) Inwariantlar we synag syýasaty
Esasy üýtgemeler:- Gapjyk boýunça 'LedgerEntry' -iň jemi deňagramlylyga deňdir; negatiw galyndylar ýok.
- Active self-exclusion/doňdurylan KYC statusynda stawkany kabul edip bolmaz.
- Wakjer diňe kiçelip biler we minusa çümmez.
- Settlement eýýäm gutaran nyrhyň statusyny üýtgetmeýär - diňe "Void/Recalc" + öwezini dolýan sim arkaly.
- Gapjygyň we nyrhlaryň üýtgemeýän synaglary property-based.
- Bulam-bujarlygyň konturlary: üpjün edijiniň gijikdirilmegi, PSP şowsuzlyklary, outbox/DLQ redaktirlemeleri.
- Shemalara gözegçilik etmek: wakalaryň göçmegi, proýeksiýalaryň backfill.
12) Telemetriýa we audit
Metrikler: p95/p99 PlaceBet/Reserve/Commit, çäklendirmeler/KUS, DLQ rate, redrive success, lag proýeksiýalary boýunça şowsuzlyklaryň paýy.
Treýsing: "topar → agregat → outbox → konsumer → proýeksiýa", bellikler 'tenant _ id', 'operation _ id', 'saga _ id'.
Audit: kadalaşdyryjy talaplar bilen deňeşdirip boljak domen hereketleriniň üýtgemeýän žurnaly.
13) Saklamak shemasy (ýönekeýleşdirilen)
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)
Agregatlarda wersiýalaşdyrmak ('version') bäsdeşlik ýazgysynda lost update-den gorar.
14) Toparlaryň API mysaly (psevdo)
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":"..." }
Ähli toparlar - 'operation _ id' idempotentlik üçin, jogaplar - 'as _ of '/' version'.
15) Howpsuzlyk we laýyklyk
RLS/ACL: ähli soraglar - 'tenant _ id' kontekstinde, rollar boýunça elýeterlilik.
PII-minimallaşdyrmak: domen wakalaryny şahsy maglumatlardan bölmek; DLQ/loglarda gizlemek.
Düzgünleşdiriji hasabatlar: wagt penjireleri boýunça üýtgemeýän heş-gollary bolan proýeksiýalar.
16) Adaty ýalňyşlyklar
Kontekstleriň arasynda güýçli baglanyşyk (Wallet göni Bet/Bonus bilýär).
Dual-write dürli kontekstlerde/outbox → balanslaryň we statuslaryň gabat gelmezligi.
Toparlaryň we konsumerleriň idempotentliginiň ýoklugy → iki sany geçiriş/hasaplaşyk.
Provaýder şertnamalarynyň domen modeline geçmegi (göçmek has kyn).
Bir "ullakan" agregat (Player hemme zady öz içine alýar) → blokirleme, pes throughput.
Hiç hili üýtgeşiklik ýok - olary barlamak we gözegçilik etmek mümkin däl.
17) Çalt reseptler
Başlamak: Ubiquitous Language we kontekstiň çäklerini düzüň; inwariantlary resminamalaşdyryň.
Pul: Wallet/Ledger - CP, kworum ýazgylary, daşarky täsirler üçin TCC.
Nyrhlar: sinhron kabul etmek + asinhron hasaplamasy, hemme zat wakalar we outbox arkaly; dempotentlik hemme ýerde.
Bonuslar: hasapdan çykarmagyň anyk ileri tutulýan we weýjerli aýratyn agregat.
Integrasiýa: elmydama ACL + shemalar/wersiýalar arkaly; ýadroda "çig" payload ýok.
Okamak: önümiň zerurlyklary üçin proýeksiýa/vitrinler; Täzelik SLA + 'as _ of'.
Operasiýa: inwariant metrikleri, DLQ/redrave playbook, rebuild vitrinalar.
18) Azyk önüminden öň çek-sanawy
- bounded contexts we olaryň şertnamalary (buýruklar/wakalar) kesgitlenildi.
- Agregatlarda aç-açan üýtgeşmeler, wersiýalaşdyrmak we empotent buýruklary bar.
- Pul amallary - TSS/berk amallar arkaly; audit girizildi.
- Integrasiýa - shemalaryň wersiýasy we ewolýusiýa synaglary bilen ACL arkaly.
- outbox/inbox, DLQ we ygtybarly redaktirleme girizildi.
- Proýeksiýalar täzelik SLA-ny amala aşyrýar, lag/staleness metrikleri bar.
- Köp tenant kwotalary/çäkleri we data residency berjaý edilýär.
- Syn edilişi: "Topar → Waka → Proýeksiýa", üýtgeşik töwekgelçilikler.
- Resminamalar: domen dili, kontekstleriň diagrammalary, hadysalaryň pleýbuklary.
Netije
"iGaming" ýadrosynda DDD - çylşyrymlylygy bölmek düzgüni: kontekstleriň anyk çäkleri, üýtgeşik agregatlar, hakykatyň çeşmesi hökmünde wakalar, daşarky integrasiýa üçin ACL we ylalaşygy aňly saýlamak. Bu çemeleşme platformany masştably, ygtybarly we degişli düzgünleşdirmelere öwürýär, aýratynlyklaryň ösüşini çaltlaşdyrýar we traffigiň, geografiýanyň we önüm setiriniň çalt ösmegi bilen hem amal töwekgelçiligini peseldýär.