DDD дар IGaming аслӣ
Платформаи IGaming як системаи домени мураккаб дар чорроҳаи молия, фароғат ва мувофиқат мебошад. DDD ба нигоҳ доштани мураккабӣ кӯмак мекунад: контекстҳои маҳдудро таъкид мекунад, забони ҳозираро сабт мекунад, инвариантҳоро бо агрегатҳо муҳофизат мекунад, ҳамгироиро тавассути қабатҳои зиддикоррупсионӣ содда мекунад ва рафтори системаро тавассути рӯйдодҳои домейн шаффоф мекунад.
1) Харитаи домейн ва заминаҳои маҳдуд (тарҳи стратегӣ)
Ҷудошавии тавсияшуда:- Контексти Player/KYC - бақайдгирӣ, санҷиш, маҳдудиятҳои бозӣ, ҳолати KYC/AML.
- Контексти ҳамён/дафтар - тавозун, бронкунӣ, муомилот, бисёрҷанба, қурби асъор.
- Контексти гарав - гарав/чипта, ҷуфт/натиҷа, нархҳо, ҳисоббаробаркунӣ, бекоркунӣ.
- Контексти даври казино/бозӣ - ҷаласаҳо, даврҳо, пушт, назорати RTP, маҳдудиятҳои гарав.
- Контексти бонус/Promo - қоидаҳои бонус, вагонҳо, ба даст овардани маблағҳои бонусӣ, зидди сӯиистифода.
- Контексти хавф/қаллобӣ - баҳодиҳӣ, сигналҳои рафторӣ, триггерҳои қулф/вақт.
- Контексти пардохтҳо - пасандозҳо/бозпас гирифтан, ҳолати дарвозаи пардохт, чорабиниҳои пардохт.
- Контексти мувофиқат/ҳисоботдиҳӣ - ҳисоботҳо ба танзимгарон, рӯйхати таҳримот, аудит.
- Контексти ҳамгироии мундариҷа/провайдер - ҳамгироӣ бо провайдерҳои бозӣ, каталогҳо, технология. статусҳо.
- Аналитика/Моделҳои хондан - пешгӯиҳо ва намоишҳо барои хондани маҳсулот.
2) Забони ҳозиразамон: аслии истилоҳот
Плеер, сессия, Game .Round, Bet/Ticket,
Вурудоти китобхонӣ, нигоҳдорӣ/захиравӣ, ҳисоббаробаркунӣ,
Қарзи бонусӣ/тавозуни бонусӣ, талабот ба вагеринг (Вейджер),
Сатҳи KYC, Маҳдудият (амонат/сессия/зиён), Худтанзимкунӣ,
Бозии провайдер, равзанаи RTP, парчами хатар, парвандаи мувофиқат.
Ин номҳо дар рамз, пойгоҳи додаҳо, ҳуҷҷатгузорӣ, санҷишҳо ва интерфейсҳо баробар истифода мешаванд.
3) Агрегатҳо ва инвариантҳо (тарҳи тактикӣ)
3. 1 Ҳамён (Агрегат: 'Ҳамён')
Инвариантҳо:- Тавозун ба қаламрави манфӣ намерасад.
- Захира + ≤ тавозуни умумӣ мавҷуд аст.
- Ноқил атомӣ ва idempotent аст (аз ҷониби 'operation _ id').
- 'Ҳамён. Захира (миқдор, сабаб, op_id) '→' Ҳамён '
- 'Ҳамён. Супориш (op_id) '→' Ҳамён '
- 'Ҳамён. Rollback (op_id) '→' Wallet
Сарҳад: Ҳамён дар бораи Bet/Bonus намедонад; он ба амалиёти почта ва захиравӣ хизмат мекунад.
3. 2 Бет/чипта (Агрегат: 'Бет')
Инвариантҳо:- Меъёрро танҳо дар равзанаи нархгузории фаъол қабул кардан мумкин аст; Маблағ ≤ маҳдудияти бозингар/сессия.
- Пас аз 'Ҳал', мақом 'ба итмом мерасад'; ҳисобкунии дубора танҳо тавассути ҷуброни амалиётҳо (беэътибор/дубора) бо аудити дақиқ иҷозат дода мешавад.
- 'Бет. Ҷойгир кунед (player_id, миқдор, нарх, op_id) '→' Betuled '(trebuet Wallet). Захира)
- 'Бет. Ҳал кунед (натиҷа, пардохт) '→' Betsoled '(ҳамёнро талаб мекунад). Супориш/озодкунӣ)
- 'Бет. Беэътибор (сабаб) '→' Bet 'Voided'
Сарҳад: Бет ба ҳамён "намерасад" - он тавассути фармонҳои домейн/оркестр даъват мекунад.
3. 3 Бозии давр (Агрегат: 'Давр')
Инвариантҳо:- Ҳар як чарх/давр дорои 'round _ id' беназир ва маблағи вобаста ба бурд/бурд мебошад.
- Равзанаи RTP аз ҳадди муайяншуда зиёд нест (дар сатҳи провайдер + қоидаҳои маҳаллӣ).
- 'Давр. Оғоз ',' давр. Staked ',' мудаввар. Натиҷа ',' давр. Пӯшида '.
3. 4 Бонус (агрегат: 'BonusGrant')
Инвариантҳо:- Вагер танҳо аз гардиши дуруст кам мешавад, аз ҳисоб баровардани бонус ба дебет дохил намешавад.
- Ҳамзамон бонус ва маблағҳои воқеиро аз рӯи қоидаҳои афзалиятнок хориҷ кардан имконнопазир аст.
- 'Bonus .Lated', 'BonusWagered', 'Bonus' Expired ',' Bonus 'Converved'.
4) Оркестрҳо, сагҳо ва ҳамбастагӣ
Синхронӣ (CP): қабули гарав ва захираи маблағ - як роҳ: 'Бет. Ҳамёнро ҷойгир кунед. Захира '(тавассути дастаи домейн/оркестр бо мӯҳлати ниҳоӣ).
Асинхронӣ (EC): ҳисобкунии меъёрҳо, ҳисобкунии бонус, таҳлил - тавассути рӯйдодҳо + outbox.
Варианти TCC: 'Кӯшиш кунед' (нигоҳ доред), 'Тасдиқ' (ӯҳдадорӣ), 'Бекор кардан' (баргардонидан) барои таъсири пулӣ.
Idempotence: ҳамаи фармонҳо 'operation _ id', истеъмолкунандагон - 'паёмдони' доранд.
5) Қабатҳои зиддикоррупсионӣ (ACL) ва ҳамгироӣ
Провайдери ACL: тарҷумаи чорабиниҳои провайдер 'Spin Натиҷа ',' BonusWagered '. Схемаҳо ва версияҳо дар дохили ACL мебошанд.
PSP ACL: ба эътидол овардани ҳолати пардохт, idempotency аз ҷониби 'psp _ tx _ id', гузариш ба 'Ledger'.
Мутобиқати ACL: ҳамгироӣ бо рӯйхати таҳримот/RAP - дар заминаи беруна; танҳо 'Screening' -и муқарраршуда 'ба дохили домен ворид мешавад.
Қоида: луғатҳо/форматҳои беруна ба ядро "ворид намешаванд".
6) Пешгӯиҳо ва моделҳои хондан
Модели хондани профили бозингар: Ҳолати KYC, маҳдудиятҳо, мукофотҳои фаъол, транзаксияҳои нав.
Модели хониши тавозунҳо: Хониши зуд барои UI/маркетинг; манбаъ - чорабиниҳои 'Ҳамён'.
Модели хондани таърихи Bet: Пагинатсия аз рӯи сана/бозӣ; манбаъ 'Бет/Ҷойгиршуда/Ҳалшуда' мебошад.
Ҳисоботҳо дар бораи мувофиқат - Назари материализатсияшуда аз ҷониби иҷорагир/минтақа.
Ҳама пешгӯиҳо пешрафтҳои номатлуб бо версия ва 'as _ of/тару тоза' мебошанд.
7) Бисёр иҷорагир ва бисёр минтақа
Ҳама субъектҳои асосӣ 'иҷорагир _ ид' ва (агар лозим бошад) 'минтақа' доранд.
Ҳудуди маълумот: плеер, ҳамён, гарав - минтақаи "хона"; танҳо агрегатҳо/гузоришҳои байниминтақавӣ.
Адолат/квотаҳо: маҳдудиятҳои дастаҳо/сек ва аз нав ба иҷорагирон.
Истиқомат/мувофиқат: маълумоти шахсӣ ва муомилот минтақаро тарк намекунанд.
8) Интихоби пайдарҳамӣ (PACELC) аз рӯи контекст
Ҳамён/китобча - Қавӣ/CP: муомилоти хаттӣ, кворуми сабтҳо.
Қабули Бет - тасдиқи синхронӣ (CP) + Моделҳои зуд хондан барои UI.
Ҳисоббаробаркунӣ/Bonus/Analytics - EC бо якҷояшавӣ/ҷуброни детерминистӣ.
KYC/Мувофиқат - метавонад барои статусҳо EC бошад, аммо қоидаҳои "бастани" синхронӣ татбиқ карда мешаванд.
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"
}
Қоидаҳо:
- Схемаҳои бозгашт/форвард-компат; таҳаввулот тавассути 'schema _ version'.
- 'outbox' ин амалиёт бо тағир додани домейн; нашр аз ҷониби қассобҳо бо бозгашт.
10) Намунаи ҷараёни "Бет бо бонус" (пайдарпаии калимаҳо)
1. 'Бет. Ҷойгир кунед '(даста) → санҷиши маҳдудиятҳои плеер ва §' Қоидаҳои бонуси ҳамён. Захира (воқеӣ + bonus _ equiv, op_id) '
2. 'БетПед' → Навсозиҳои моделиро 'Вагонҳои кушод' хонед
3. Провайдер натиҷаро → the → 'Round ACL нашр мекунад. Натиҷа '
4. Оркестр ҳисоб мекунад: 'Бет. Ҳал кунед (натиҷа, пардохт) '→' Ҳамён. Супориш (op_id) 'ва агар ғолиб омада бошад,' BonusWagered '→ табдили имконпазири бонус ба шахсони воқеӣ.
5. 'Betsoled' → пешгӯиҳои таърих ва тавозун, ҳисобот.
11) Сиёсати ғайривариантӣ ва озмоишӣ
Инвариантҳои асосӣ:- Ҷамъи ҳамаи 'LedgEr Entry' дар ҳамён ба тавозун баробар аст; пасмондаҳои манфӣ нестанд.
- Шумо Бетро бо ҳолати худидоракунии фаъол/яхкардашудаи KYC қабул карда наметавонед.
- Гарав метавонад танҳо коҳиш ёбад ва "дар минус" шино накунад.
- Ҳисоббаробаркунӣ ҳолати меъёри аллакай анҷомёфтаро тағир намедиҳад - танҳо тавассути транзаксияи 'Void/Recalc' +.
- Санҷишҳои амволи инвариантҳои ҳамён ва гаравҳо.
- Контурҳои бетартибӣ: таъхири провайдер, нокомии PSP, outbox/DLQ redrives.
- Назорати схема: муҳоҷирати рӯйдодҳо, пешгӯиҳои бозгашт.
12) Телеметрия ва аудит
Нишондиҳандаҳо: p95/p99 дар Place
Пайгирӣ: spans "komanda → agrigat → outbox → konsyumer → proyektsiya", барчаспҳои 'иҷорагир _ ид', 'operation _ 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":"..." }
Ҳама фармонҳо бо 'operation _ id' барои номутобиқатӣ, ҷавобҳо бо 'as _ of '/' version' мебошанд.
15) Бехатарӣ ва риояи
RLS/ACL: ҳама дархостҳо - дар заминаи 'иҷорагир _ ид', дастрасӣ аз рӯи нақш.
Кам кардани PII: ҷудо кардани рӯйдодҳои домейн аз маълумоти шахсӣ; ниқоб дар DLQ/гузоришҳо.
Ҳисоботҳои танзимкунанда: пешгӯиҳо бо имзои бетағйир дар тирезаҳои вақт.
16) Хатогиҳои маъмулӣ
Пайвасти қавӣ байни контекстҳо (Wallet медонад Bet/Bonus мустақиман).
Дучанд навиштан ба заминаҳои гуногун бидуни sagas/outbox → номувофиқатии тавозунҳо ва статусҳо.
Набудани фармондиҳӣ ва idempotency истеъмолкунанда → такрори транзаксияҳо/ҳисобҳо.
Ҷараёни шартномаҳои провайдер ба модели домейн (муҳоҷират мушкилтар аст).
Як агрегати "азим" (Player ҳамаашро дар бар мегирад) қулф →, интиқоли кам.
Инвариантҳои возеҳ вуҷуд надоранд - онҳоро тафтиш ва назорат кардан мумкин нест.
17) Дорухатҳои зуд
Оғоз: муайян кардани ҳудуди забон ва контекст; инвариантҳои ҳуҷҷатӣ.
Пул: Ҳамён/Китобча - CP, вурудоти кворум, TCC барои эффектҳои беруна.
Гаравҳо: қабули синхронӣ + ҳисобкунии асинхронӣ, ҳама тавассути рӯйдодҳо ва қуттиҳо; idempotency дар ҳама ҷо аст.
Бонусҳо: воҳиди алоҳида бо афзалияти аз ҳисоб баровардан ва вагер.
Интегратсия: ҳамеша тавассути ACL + схемаҳо/версияҳо; ягон бори "хом" дар аслӣ нест.
Хонишҳо: пешгӯиҳо/намоишҳо оид ба эҳтиёҷоти маҳсулот; SLA тару тоза + 'as _ of'.
Фаъолият: ченакҳои инвариантҳо, DLQ/китобҳои бозсозӣ, намоишгоҳҳоро барқарор кунед.
18) Рӯйхати санҷиши пеш аз фурӯш
- Контекстҳои маҳдуд ва шартномаҳои онҳо (фармонҳо/рӯйдодҳо) муайян карда мешаванд.
- Агрегатҳо фармонҳои возеҳи ғайривариантӣ, версионалӣ ва idempotent доранд.
- Амалиёти пулӣ - тавассути TCC/муомилоти қатъӣ; аудит фаъол гардид.
- Интегратсия - тавассути ACL-ҳо бо санҷишҳои схема ва эволютсия.
- Outbox/паёмдони татбиқшуда, DLQ ва redraw бехатар.
- Пешгӯиҳо тару тозаи SLA-ро татбиқ мекунанд, ченакҳои ақибмонда/ноустувор мавҷуданд.
- Квотаҳо/маҳдудиятҳои иҷорагир ва истиқомати маълумот риоя карда мешаванд.
- Мушоҳидакорӣ: пайгирии "komanda → sobytiye → proyektsiya", огоҳиҳо аз ҷониби инвариантҳо.
- Ҳуҷҷатгузорӣ: забони домейн, диаграммаҳои контекстӣ, дафтарҳои бозӣ.
Хулоса
DDD дар ядрои IGaming як интизоми ҷудокунии мураккабӣ мебошад: сарҳадҳои возеҳи контекст, агрегатҳо бо инвариантҳо, рӯйдодҳо ҳамчун манбаи ҳақиқат, ACL барои ҳамгироии беруна ва интихоби мувофиқати огоҳона. Ин равиш платформаро миқёспазир, боэътимод ва ба қоидаҳо мувофиқат мекунад, рушди хусусиятҳоро суръат мебахшад ва хатарҳои амалиётиро коҳиш медиҳад - ҳатто бо афзоиши босуръати трафик, ҷуғрофия ва хатҳои маҳсулот.