Balans va hamyonlar: multi-wallet arxitekturasi
1) Nega multi-wallet va qanday maqsadlar
Bitta «balans = son» yozuvi iGaming haqiqatini qoplamaydi. Alohida hamyonlar/subschyotlar kerak: real pul (cash), bonus mablag’lari, veyjer-pullar, frispinlar, komp-pointlar, ba’zan - valyuta hamyonlari (EUR/USD/BRL).
Arxitektura maqsadlari:- Pulning aniqligi (double-entry, tinglanuvchanlik).
- Hisobdan chiqarish siyosati (masalan, avval bonus/veyjer, keyin cash).
- Tezlik (p95 API ≤ 250-400 ms, real vaqtda stavka/settlment).
- Xavfsizlik va komplayens (KYC/AML, mas’uliyatli o’yin limitlari, regulyatorlar).
- Ko’lami: cho’qqilar → o’n minglab operatsiyalar/sek, milliardlab posting/oy.
2) Ma’lumotlar modeli: «Ledger + Subwallets»
Minimal mohiyatlar
Account: oʻyinchi/brend/market.
Jadvallar namunasi (soddalashtirilgan)
sql
- Double-entry uchun balans hisobvaraqlari (shu jumladan xizmat hisobvaraqlari)
accounts(id, owner_user_id, type, currency, status,...)
-- O’tkazish (ikki marta yozib olish, biznes operatsiyasiga havola)
ledger_entries(id, posting_id, debit_account_id, credit_account_id,        amount_minor, currency, category, operation_id, created_at)
- Xoldlar (zaxiralar)
holds(id, account_id, amount_minor, currency, reason, expires_at, state,    operation_id, created_at)
- Hisobdan chiqarish siyosati (ustuvorliklar)
spend_policies(id, market, wallet_priority jsonb, updated_at)
-- fx_rates kross-valyuta kurslari (ccy_from, ccy_to, rate, precision, valid_from)Qoida: haqiqat simlar jurnalida (’ledger _ entries’) yashaydi. Joriy balans - yoki agregat (materiallashtirilgan snepshot) yoki jurnaldan hisoblab chiqariladi (qimmat, lekin faqat to’g "ri).
3) Hamyonlarning turlari va ularning xulq-atvori
4) Hisobdan chiqarish siyosati va ustuvorlik tartibi
Manba algoritmini aniq rasmiylashtiring: Misol (slotlar/kazino):1. Avval VAGER dan hisobdan chiqarish (agar veyjer aktiv boʻlsa).
2. Keyin BONUSDAN hali tugamadi.
3. Qoldiq - CASH.
Misol (sport):1. Birinchidan, CASH (regulyator/soliq).
2. So’ngra BONUS (freebet) ni WAGER ga o’tkazish.
Postings’da «siyosat yechimi» ni atribut sifatida saqlang, shunda sapport va audit «nima uchun bunday yozib olinganini» ko’radi.
5) Pul va operatsiyalarning hayot sikli
Depozit
1.’POST/wallet/deposit’→ pending yozuvini yarating (inbox kolbeka PSP).
2. Vebxuk PSP (imzo HMAC, idempotentlik’operation _ id’) → credit CASH, category =’DEPOSIT’.
3. ’wallet _ updated’ voqeasini eʼlon qilyapmiz.
Stavka
1.’POST/bet/place’→ manbaning hisobvarag’ida hold (zaxira) yarating (CASH/BONUS/WAGER).
2. Stavka tasdiqlanganda → transfer hold → debit manbai, credit provayderning xizmat «hisob-kitob» hisobvarag’i.
3. Bekor qilinganda - release hold.
Settlement (natija)
G’alaba: provayderning siyosat bo’yicha debit hisobvarag’i → credit CASH yoki WAGER → BONUS → CASH.
Yo’qotish: o’yinchiga kreditsiz provayderning → «xarajat» simlari bilan yopamiz.
1. KYC/AML tekshiruvi, mas’uliyatli o’yin limitlari.
2. Hold summasi.
3. PSP muvaffaqiyatlari → yakuniy debit CASH → credit «to’lov» hisobi.
4. PSP → release hold muvaffaqiyatsiz tugadi.
6) Idempotentlik va exactly-once «ma’nosi bo’yicha»
Hamma joyda’operation _ id’(UUID/yaxshilangan ULID) noyob indeksga ega. Qayta soʻrash → Oʻtmishdagi holat.
PSP/oʻyin provayderi vebxuklari:’event _ id + signature’uchun dedupe bilan Inbox jadvali. Qayta ishlash - idempotent vorker (Outbox-pattern).
Idempotency-Key - mijoz uchun HTTP; TTL 24-72 soatdan ≥ saqlanadi
7) Zaxiralar va xoldlar (holds)
Xold - hisobdan chiqarish emas, balki mavjud qoldiqni «muzlatish».
Qoidalar:- Xoldning umr koʻrish muddati: seconds → minutes (stavka) yoki soat (chiqish).
- Xold qisman yoki toʻliq qoplanishi mumkin (partial settle).
- expire - avtomatik release va hodisa.
- Aloqani saqlang’hold _ id’bet _ id/withdraw _ id’.
8) Valyutalar, FX va yaxlitlash
Pul summalari - minor birliklarda (cents), turi - butun.
Bank yaxlitlari (round half to even) yoki T&C bo’yicha
FX:’CASH (EUR) ’CASH (USD)’hamyonlarni ajratish yaxshiroqdir. Konversiyani alohida operatsiya sifatida bajarish:- ’debit EUR, credit FX_EURUSD' va’ debit FX_EURUSD, credit USD’- audit uchun shaffof.
- Nizoda kursni avtomat bilan «yetib borish» taqiqlangan; barcha qoidalar FX siyosatida.
9) Mas’uliyatli o’yin va limitlar
Deposit/Bet/Loss/Session limitlari (kun/hafta/oy), «cooling-off», self-exclusion.
hold/debit oldidan pre-check sifatida amalga oshiriladi.
Rad etish daftarlari - alohida audit-jurnalga, sifport va tartibga soluvchiga taqdim etiladi.
10) Hamyon atrofidagi antifrod-signallar
Klaster qurilmalari/ASN, tez-tez oz miqdordagi depozitlar → yirik xulosalar, yuvish patternlari.
Velocity-limit’deposit/withdraw’bo’yicha BIN/mamlakat/qurilma bo’yicha.
Qabul qiluvchilar uchun blok-varaqlar (hamyonlar/IBAN), «pashshalar» ro’yxati.
Hamyon voqealari → feature store skoringa (login/depozit/stavka).
11) Konsistentlik va unumdorlik
Haqiqat vs kesh
Haqiqat - ledger. API uchun «balans olish» - materiallashtirilgan snapshot (’user _ id + wallet _ type → balance_minor, version’) saqlang.
Yozish: DBdagi tranzaksiya → keshni nogironlashtirish.
«Og’ir» floularda (jonli) short-TTL 1-5 + haqiqatni ko’rib chiqish/katta stavkadan oldin tekshirish kerak.
Skalerlash
’user _ id’ bo’yicha shardlash (modul/reyting), CASH vs BONUS ostida alohida shard-pullar.
Issiq kalitlar (VIP/botlar) - request coalescing po’user _ id’.
Asinxron agregatsiyalar (fondagi’posting’→’snapshot-apdeyter’ni jamlang).
12) API-kontraktlar (psevdo)
Balans
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}
]}Stavka (xold bilan)
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}Settlement
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) Simlar namunalari (double-entry)
Depozit €100 (PSP fee €1, kommis. hisobvaraq - alohida)
Debit: PSP_Settlements(EUR)   10000
Credit: User. CASH(EUR)         10000
Debit: User. CASH (EUR) 100 (fee)
Credit: PSP_Fees(EUR)          100BONUSdan 5 yevro stavkasi (WAGERga o’tkazish)
Debit: User. BONUS(EUR)       500
Credit: User. WAGER (EUR) 500 («veyjer» ga o’tish)
Debit: User. WAGER(EUR)       500
Credit: Provider. Settlement (EUR) 500 (stavka hisobdan chiqarilgan)G’alaba €12. 5 → CASH
Debit: Provider. Settlement(EUR)  1250
Credit: User. CASH(EUR)         1250Xolddan chiqarish (HOLD xizmat hisobvarag’i orqali sotish)
Debit: User. CASH(EUR)       500
Credit: User. HOLD (EUR) 500 (yaratilgan hold)
-- bilan settle
Debit: User. HOLD(EUR)       500
Credit: Provider. Settlement(EUR)   500
-- bekor qilinganda
Debit: User. HOLD(EUR)       500
Credit: User. CASH(EUR)         50014) Audit, o’zgaruvchanlik va muvofiqlik
Jurnal uchun WORM/immutability (obyekt ombori/WAL arxivi).
Kirish meta-jurnallari: kim limitlarni o’qigan/o’zgartirgan, kim qo’lda tuzatishlar kiritgan (faqat asosli «adjustment-posting» orqali).
GDPR/regulyatorlar: tranzaksiyalarni 5-10 yil davomida saqlash (yurisdiksiya bo’yicha), o’yinchi uchun hisob-kitoblarning shaffofligi (hisobdan chiqarish/veyjer tarixi).
15) Muvaffaqiyatsizlikka chidamlilik va DR
Multi-AZ majburiy; hamyon uchun DR-mintaqa: zonada sync-replikatsiya, mintaqaga async; PITR yoqilgan.
Promote standby - faqat chek varaqasi bo’yicha qo’lda (split-brain chiqarib tashlansin).
Tiklanishni har hafta tekshirish (test-restore), nazorat hisobotlari summasini solishtirish.
16) Hamyonning kuzatilishi
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`.
Alertlar: success PSPning bozor bo’yicha pasayishi,’hold _ expired _ rate’ning o’sishi, o’yin provayderining rasinxronlari (tasdiqlash yo’q> N min).
17) Test sinovlari va sifat nazorati
PSP/o’yin provayderlari bilan kontrakt testlari (vebxuklar/imzolar).
Property-based pul testlari: debetlar summasi = = har bir Posting-dagi kreditlar summasi.
Fuzz/chaos: PSP/provayderning kechikishlari, vebxuklarni takrorlash, tarmoq flapplari.
Yuklama: burst stavkalari (60-120 s), soaks (4-8 soat), nazorat’queue _ lag’i p99.
18) Ishlab chiqarishga tayyorlik chek-varaqasi
- Ikki marta ledger yozish, barcha operatsiyalar Posting’operation _ id’orqali amalga oshiriladi.
- Aniq spend-policies va ustuvorlik tartibi (posting bilan birga).
- TTL/partial settle/expiry xoldlari, bet/withdraw bilan aloqa.
- Inbox/Outbox, HMAC vebxuklari, barcha chegaralardagi idempotentlik.
- Alohida CASH/BONUS/WAGER/FS/POINTS hamyonlari; valyutalar bo’yicha bo’lish.
- FX va minor birliklarda yaxlitlash; konversiya - alohida operatsiya.
- Mas’uliyatli o’yin limitlari hold/debit gacha; rad etish auditi.
- Oʻqish uchun kesh (qisqa TTL) + tanqidiy harakatlardan oldin haqiqatni majburiy tekshirish.
- PITR/backaplar/DR-skriptlar; qo’lda promote, muntazam DR-mashqlar.
- Dashbordlar/alertlar SLI + texnik; WORM loglari va kirish meta-jurnallari.
- Yuklash/xaos-testlar; reconciliation hisobotlari PSP/provayderlar bilan.
Xulosa
Multi-wallet arxitekturasi «ko’p balans raqamlari» emas, balki ikki tomonlama yozuv, sarflash siyosati, zaxira va audit va o’yinchilar uchun shaffof izga ega bo’lgan moliyaviy tizimdir. Haqiqatni jurnalda saqlang, xoldlar va idempotentlikdan foydalaning, hamyonlar va valyutalarni ajrating, reconciliation va DR. shunday qilib hamyon UX uchun tez, pul uchun aniq va eng yuqori yuk va tartibga solish tekshiruvlari uchun barqaror bo’ladi.
