Баланс және әмияндар: multi-wallet сәулеті
1) Неге multi-wallet және қандай мақсаттар
Бір «баланс = сан» жазбасы iGaming шындығын қамтымайды. Жекелеген әмияндар/қосалқы шоттар қажет: нақты ақша (cash), бонустық қаражат, вэйджер-пул, фриспиндер, комп-поинттер, кейде - валюталық әмияндар (EUR/USD/BRL).
Сәулет мақсаттары:- Ақшаның дәлдігі (double-entry, аудиттелуі).
- Есептен шығару саясаты (мысалы, алдымен бонус/вэйджер, содан кейін cash).
- Жылдамдық (p95 API ≤ 250-400 мс, нақты уақыттағы ставка/сеттлмент).
- Қауіпсіздік және комплаенс (KYC/AML, жауапты ойын лимиттері, реттегіштер).
- Масштабы: шыңдар → он мыңдаған операциялар/сек, миллиардтаған постинг/ай.
2) Деректер моделі: «Ledger + Subwallets»
Ең аз мәндер
Account: ойыншы/бренд/маркет.
Кестелер үлгісі (жеңілдетілген)
sql
- double-entry үшін баланстық шоттар (қызметтік шоттарды қоса алғанда)
accounts(id, owner_user_id, type, currency, status,...)
-- Өткізу (қосарланған жазба, бизнес-операцияға сілтеме)
ledger_entries(id, posting_id, debit_account_id, credit_account_id,        amount_minor, currency, category, operation_id, created_at)
-- Холдингтер (резервтер)
holds(id, account_id, amount_minor, currency, reason, expires_at, state,    operation_id, created_at)
- Есептен шығару саясаты (басымдықтар)
spend_policies(id, market, wallet_priority jsonb, updated_at)
-- fx_rates кросс-валюта бағамдары (ccy_from, ccy_to, rate, precision, valid_from)Ереже: шындық сымдар журналында ('ledger _ entries') тұрады. Ағымдағы баланс - не агрегат (материалдандырылған снэпшот), не журналдан есептеледі (қымбат, бірақ жалғыз дұрыс).
3) Әмияндардың түрлері және олардың мінез-құлқы
4) Есептен шығару саясаты және басымдық тәртібі
Қаражат көзінің алгоритмін нақты рәсімдеңіз: Мысал (слоттар/казино):1. Алдымен WAGER-ден есептен шығару (егер вэйджер белсенді болса).
2. Содан кейін BONUS-тан әлі таусылмады.
3. Қалдық - CASH.
Мысал (спорт):1. Алдымен CASH (реттеуші/салық).
2. Содан кейін WAGER-ге аудару арқылы BONUS (freebet).
Postings бағдарламасында «саясат шешімін» атрибут ретінде сақтаңыз, сонда саппорт пен аудит «неліктен осылай есептен шығарылғанын» көре алады.
5) Ақша мен операциялардың өмірлік циклі
Депозит
1. 'POST/wallet/deposit' → pending жазбасын жасаңыз (inbox колбэк PSP).
2. PSP вебхук (қолы HMAC, 'operation _ id' бойынша сәйкестігі) → credit CASH, category = 'DEPOSIT'.
3. 'wallet _ updated' оқиғасын жариялаймыз.
Мөлшерлеме
1. 'POST/bet/place' → көзінің шотында hold (резерв) жасаймыз (CASH/BONUS/WAGER).
2. Мөлшерлемені растау кезінде → аударым hold → debit көзі, credit провайдерінің қызметтік «есептік» шоты.
3. Болдырмау кезінде - release hold.
Сеттлмент (нәтиже)
Ұтыс: провайдердің «есептік» шотының debit → credit CASH немесе WAGER → BONUS → CASH саясаты бойынша.
Жоғалту: провайдердің → «шығынын» ойыншыға кредитсіз өткізумен жабамыз.
1. KYC/AML тексеру, жауапты ойын лимиттері.
2. Шығару сомасына Hold.
3. PSP табысы → соңғы debit CASH → credit «төлем» шоты.
4. PSP → release hold.
6) Ұқсастық және exactly-once «мағынасы бойынша»
Барлық жерде бірегей индексі бар 'operation _ id' (UUID/жақсартылған ULID). Қайталау сұрауы → өткен әрекеттің күйі.
PSP/ойын провайдерінің веб-хаптары: 'event _ id + signature' бойынша dedupe бар Inbox-кесте. Өңдеу - демпотенттік воркер (Outbox-паттерн).
Idempotency-Key HTTP клиентке арналған; TTL 24-72 сағ ≥ сақтау
7) Резервтер мен холдтар (holds)
Холд - есептен шығару емес, қолжетімді қалдықты «қатыру».
Ережелер:- Холдтың өмір сүру мерзімі: seconds → minutes (ставка) немесе сағат (шығарылым).
- Холд жартылай немесе толық өтелуі мүмкін (partial settle).
- expire кезінде - автоматты релиз және оқиға.
- 'hold _ id' bet _ id/withdraw _ id 'байланысын сақтаңыз.
8) Валюталар, FX және дөңгелектеу
Ақшалай сома - минор бірлігімен (cents), түрі - бүтін.
Банктік дөңгелектеу (round half to even) не T&C бойынша
FX: 'CASH (EUR) ' CASH (USD) 'әмияндарды бөлген дұрыс. Конверсияны жеке операция ретінде жасау:- 'debit EUR, credit FX_EURUSD' және' debit FX_EURUSD, credit USD '- аудит үшін ашық.
- Дау кезінде автоматты түрде курсты «созуға» тыйым салынған; барлық ережелер - FX саясатында.
9) Жауапты ойын және лимиттер
Deposit/Bet/Loss/Session лимиттері (күн/апта/ай), «cooling-off», self-exclusion.
hold/debit алдында pre-check ретінде іске асырылады.
Бас тарту журналдары - жеке аудит-журналға, саппорт пен реттеушіге қол жетімді.
10) Әмиян айналасындағы антифрод-сигналдар
Құрылғылар кластерлері/ASN, аз соманың жиі депозиттері → ірі қорытындылар, жуу үлгілері.
Velocity-BIN/ел/құрылғы бойынша 'deposit/withdraw' лимиттері.
Алушыларға арналған блок-парақтар (әмияндар/IBAN), «қашырлар» тізімі.
Әмиян оқиғалары → в feature store скоринг (логин/депозит/ставка).
11) Консистенттілік және өнімділік
Шынайы кэш
Ақиқат - ledger. «Теңгерімді алу» API үшін - материалдандырылған снэпшотты ұстаңыз ('user _ id + wallet _ type → balance_minor, version').
Жазу: ДБ транзакция → кэшті мүгедектендіру.
«Ауыр» флоуда (live) short-TTL 1-5 + шығару/ірі мөлшерлеме алдында ақиқатты міндетті түрде тексеру орынды.
Өрнектеу
'user _ id' бойынша шардалау (модуль/ранжирлеу), CASH vs BONUS астында жеке шард-пулдар.
Ыстық кілттер (VIP/боттар) - 'user _ id' бойынша request coalescing.
Асинхрондық агрегациялар (фондағы 'posting' → «снапшот-апдейтер» жиынтығы).
12) API-келісімшарттар (жалған)
Теңгерім
http
GET /v1/wallets? types=CASH,BONUS
→ 200 {"wallets":[
{"type":"CASH","currency":"EUR","available":12050,"hold":500,"version":1942},  {"type":"BONUS","currency":"EUR","available":3000,"wager_req":15000}
]}Мөлшерлеме (холдингпен)
http
POST /v1/bets/place
{"bet_id":"b_123","amount":500,"currency":"EUR","source_policy":"casino_default", "idempotency_key":"ik_abc"}
→ 201 {"status":"HELD","hold_id":"h_789","expires_in":30}Сеттлмент
http
POST /v1/bets/settle
{"bet_id":"b_123","result":"WIN","payout":1250}
→ 200 {"status":"SETTLED","cash_delta":+1250}http
POST /v1/withdrawals
{"withdraw_id":"w_456","amount":10000,"currency":"EUR","method":"sepa", "idempotency_key":"ik_def"}
→ 202 {"state":"PENDING","next_check_sec":2,"status_url":"/v1/withdrawals/w_456"}13) Сымдар мысалдары (double-entry)
Депозит €100 (PSP fee €1, коммис. шот - жеке)
Debit: PSP_Settlements(EUR)   10000
Credit: User. CASH(EUR)         10000
Debit: User. CASH (EUR) 100 (fee аударамыз)
Credit: PSP_Fees(EUR)          100BONUS-тан €5 мөлшерлемесі (WAGER-ге аудару)
Debit: User. BONUS(EUR)       500
Credit: User. WAGER (EUR) 500 («вэйджерге» ауысу)
Debit: User. WAGER(EUR)       500
Credit: Provider. Settlement (EUR) 500 (ставка есептен шығарылды)Ұтыс €12. 5 → CASH
Debit: Provider. Settlement(EUR)  1250
Credit: User. CASH(EUR)         1250Холдингтік есептен шығару (HOLD қызметтік шоты арқылы сату)
Debit: User. CASH(EUR)       500
Credit: User. HOLD (EUR) 500 (құрылған hold)
-- кезінде settle
Debit: User. HOLD(EUR)       500
Credit: Provider. Settlement(EUR)   500
-- болдырмау кезінде
Debit: User. HOLD(EUR)       500
Credit: User. CASH(EUR)         50014) Аудит, өзгермейтіндігі және сәйкестігі
Журналға арналған WORM/immutability (нысан сақтау орны/WAL мұрағаты).
Қол жеткізу метажурналары: кім лимиттерді оқыды/өзгертті, кім қолмен түзетулер жасады (негіздемесі бар «adjustment-posting» арқылы ғана).
GDPR/реттегіштер: транзакцияларды 5-10 жыл сақтау (юрисдикция бойынша), ойыншы үшін есеп айырысудың ашықтығы (есептен шығару/вэйджер тарихы).
15) Істен шығу тұрақтылығы және DR
Multi-AZ міндетті түрде; Әмиян үшін DR-аймақ: аймақтағы sync-репликация, аймақтағы async; PITR қосылды.
Promote standby - чек-парақ бойынша қолмен ғана (split-brain алынып тасталсын).
Қалпына келтіруді апта сайын тексеру (test-restore), бақылау есептерінің сомасын салыстыру.
16) Әмиянның бақылануы
SLI: `deposit_success_ratio`, `withdraw_success_ratio`, `bet_hold_latency_p95`, `settlement_latency_p95`.
Тех: `ledger_postings_rate`, `db_connections_saturation`, `queue_lag_seconds`, `hold_expired_rate`.
Тәуекелдер: нарық бойынша PSP success құлдырауы, 'hold _ expired _ rate' өсуі, ойын провайдерінің рассинхроны (> N мин растауы жоқ).
17) Тестілеу және сапаны бақылау
PSP/ойын провайдерлерімен келісімшарттық тестілер (вебхактар/қолтаңбалар).
Property-based ақша тестілері: дебеттер сомасы = = әрбір Posting кредиттер сомасы.
Fuzz/chaos: PSP/провайдердің кідірістері, вебхуктарды қайталау, желілік флаппи.
Жүктеме: burst ставкалары (60-120 с), soaks (4-8 с), бақылау 'queue _ lag' және p99.
18) Азық-түлік дайындығының чек-парағы
- Қос жазба ledger, барлық операциялар Posting арқылы 'operation _ id'.
- Нақты spend-policies және басымдық тәртібі (постингпен бірге).
- TTL/partial settle/expiry бар холдингтер, bet/withdraw байланысы.
- Inbox/Outbox, HMAC-вебхактар, барлық шекаралардағы теңсіздік.
- Жеке CASH/BONUS/WAGER/FS/POINTS әмияндары; валюталар бойынша бөлу.
- FX және шағын бірліктерде дөңгелектеу; конверсия - жеке операциямен.
- hold/debit дейінгі жауапты ойын лимиттері; істен шығулар аудиті.
- Оқу кэші (қысқа TTL) + сыни әрекеттер алдында ақиқатты міндетті түрде тексеру.
- PITR/backaps/DR-скрипттер; қолмен promote, тұрақты DR-жаттығулар.
- Дашбордтар/алерталар SLI + техникалық; WORM логтары мен қатынау метажурналары.
- Жүктеме/хаос-тесттер; PSP/провайдерлермен reconciliation есептері.
Түйіндеме
Multi-wallet архитектурасы - бұл «көп теңгерім сандары» емес, екі рет жазылатын, жұмсау саясаты, резервтеу және аудит пен ойыншылар үшін ашық ізі бар қаржы жүйесі. Шындықты журналда сақтаңыз, холдингтер мен іспеттілікті пайдаланыңыз, әмияндар мен валюталарды бөліңіз, reconciliation және DR. әмиян UX үшін жылдам, ақша үшін дәл және ең жоғары жүктемелер мен реттеуші тексерулер үшін тұрақты болады.
