Balans və pul kisələri: multi-wallet arxitekturası
1) Niyə multi-wallet və hansı məqsədlər
Bir qeyd «balans = sayı» iGaming reallığını əhatə etmir. Ayrı-ayrı cüzdanlar/alt hesablar lazımdır: real pul (cash), bonus vəsaitləri, veyjer-hovuz, frispins, comp-point, bəzən - valyuta cüzdanları (EUR/USD/BRL).
Memarlıq məqsədləri:- Pul dəqiqliyi (double-entry, auditoriya).
- Debet siyasəti (məsələn, əvvəlcə bonus/vager, sonra cash).
- Sürət (p95 API ≤ 250-400 ms, real vaxt dərəcəsi/quruluş).
- Təhlükəsizlik və uyğunluq (KYC/AML, məsuliyyətli oyun limitləri, tənzimləyicilər).
- Miqyaslı: pik → on minlərlə əməliyyat/san, milyardlarla postinq/ay.
2) Məlumat modeli: «Ledger + Subwallets»
Minimal varlıqlar
Account: oyunçu/marka/market.
Cədvəllər nümunəsi (sadələşdirilmiş)
sql
-- Double-entry üçün balans hesabları (xidməti hesablar daxil olmaqla)
accounts(id, owner_user_id, type, currency, status,...)
-- Kabel (ikiqat qeyd, biznes əməliyyatına keçid)
ledger_entries(id, posting_id, debit_account_id, credit_account_id,        amount_minor, currency, category, operation_id, created_at)
-- Holdlər (ehtiyatlar)
holds(id, account_id, amount_minor, currency, reason, expires_at, state,    operation_id, created_at)
-- Silinmə siyasəti (prioritetlər)
spend_policies(id, market, wallet_priority jsonb, updated_at)
-- Cross-valyuta məzənnələri fx_rates (ccy_from, ccy_to, rate, precision, valid_from)Qayda: həqiqət kabel jurnalında yaşayır ('ledger _ entries'). Cari balans - ya aqreqat (materiallaşdırılmış snapshot), ya da jurnaldan hesablanır (bahalı, lakin yeganə həqiqət).
3) Pul kisələrinin növləri və davranışları
4) Silinmə siyasəti və prioritet qaydası
Alqoritmi dəqiq rəsmiləşdirin: Nümunə (slots/casino):1. Əvvəlcə WAGER-dən silin (əgər aktiv vager varsa).
2. Sonra BONUS bitməyib.
3. Qalıq - CASH.
Nümunə (idman):1. İlk CASH (tənzimləyici/vergi).
2. Sonra WAGER tərcümə BONUS (freebet).
Postings-də "siyasət həlli 'ni atribut kimi saxlayın ki, sapport və audit" niyə belə yazıldığını "görsün.
5) Pul və əməliyyatların həyat dövrü
Depozit
1. 'POST/wallet/deposit' → pending qeydini (PSP inbox colback) yaradır.
2. PSP vebhuk (imzası HMAC, idempotentlik 'operation _ id') → credit CASH, category = 'DEPOSIT'.
3. «wallet _ updated» hadisəsini dərc edirik.
Bahis
1. 'POST/bet/place' → mənbə hesabında hold (ehtiyat) yaradır (CASH/BONUS/WAGER).
2. Bahis təsdiq edildikdə → köçürmə hold → debit mənbə, kredit xidməti «hesablaşma» hesabı provayder.
3. Ləğv edildikdə - release hold.
Settlement (nəticə)
Uduşlar: provayderin «hesablaşma» hesabının debit → kredit CASH və ya WAGER → BONUS → CASH siyasəti üzrə.
Uduzma: Provayderin «xərcləri» ilə qapadırıq → oyunçuya kredit vermədən.
1. KYC/AML yoxlama, məsuliyyətli oyun limitləri.
2. Hold məbləği.
3. PSP müvəffəqiyyəti → son debit CASH → kredit hesabı «ödəniş».
4. PSP → release hold.
6) İdempotentlik və exactly-once «mənasında»
Hər yerdə 'operation _ id' (UUID/təkmilləşdirilmiş ULID) unikal indeks ilə. Təkrar sorğu → keçmiş əməliyyat statusu.
PSP/oyun provayderi vebhukları: dedupe ilə inbox cədvəli 'event _ id + signature'. Emal - idempotent worker (Outbox-pattern).
Idempotency-Key HTTP müştəri üçün; TTL 24-72 saat ≥ saxlanılır.
7) Ehtiyatlar və holdlar (holds)
Hold - silinmə deyil, mövcud qalığın «dondurulması».
Qaydalar:- Holdun ömrü: seconds → minutes (bahis) və ya saat (çıxış).
- Hold qismən və ya tamamilə ödənilə bilər (partial settle).
- expire - avtomatik release və hadisə.
- 'hold _ id' bet _ id/withdraw _ id 'əlaqəsini saxlayın.
8) Valyutalar, FX və yuvarlaqlaşdırma
Pul məbləğləri - minor vahidlərdə (cents), növü - bütöv.
Bank dairələri (round half to even) və ya T&C.
FX: 'CASH (EUR) ' CASH (USD) 'cüzdanları ayırmaq daha yaxşıdır. Ayrı bir əməliyyat kimi çevirmək:- 'debit EUR, credit FX_EURUSD' və' debit FX_EURUSD, credit USD '- audit üçün şəffafdır.
- Mübahisə zamanı kursu avtomatlaşdırmaq qadağandır; bütün qaydalar - FX siyasətində.
9) Məsuliyyətli oyun və limitlər
Deposit/Bet/Loss/Session limitləri (gün/həftə/ay), «cooling-off», self-exclusion.
hold/debit əvvəl pre-check kimi həyata keçirilir.
Uğursuzluq qeydləri - ayrı bir audit-jurnalda, bir sapport və tənzimləyici üçün mövcuddur.
10) cüzdan ətrafında antifrod siqnalları
Cihaz klasterləri/ASN, tez-tez kiçik məbləğli depozitlər → böyük nəticələr, yuyucu nümunələr.
Velocity-limitləri BIN/ölkə/cihaz üzrə 'deposit/withdraw'.
Alıcılar üçün blok vərəqlər (cüzdan/IBAN), qatırların siyahısı.
Cüzdan hadisələri → feature store skoring (giriş/depozit/bahis).
11) Tutarlılıq və performans
Həqiqət vs cache
Həqiqət - ledger. API üçün «balans əldə edin» - materiallaşdırılmış snapshot ('user _ id + wallet _ type → balance_minor, version') saxlayın.
Yazmaq: DB → əlil cache əməliyyat.
«Ağır» floularda (canlı) 1-5 şort-TTL + çıxarılmadan/böyük bahisdən əvvəl həqiqətin məcburi yoxlanılması ilə uyğundur.
Skalasiya
'user _ id' (modul/sıralama) şərti, CASH vs BONUS altında ayrı-ayrı şard hovuzları.
Qaynar açarlar (VIP/botlar) - request coalescing by 'user _ id'.
Asinxron aqreqasiyalar (fonda 'posting' → «snapshot-updater» yığın).
12) API müqavilələri (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}
]}Bahis (hold ilə)
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) Kabel nümunələri (double-entry)
Depozit €100 (PSP fee €1, kommis. hesab - ayrıca)
Debit: PSP_Settlements(EUR)   10000
Credit: User. CASH(EUR)         10000
Debit: User. CASH (EUR) 100 (fee köçürülür)
Credit: PSP_Fees(EUR)          100BONUS-dan €5 dərəcəsi (WAGER-ə tərcümə)
Debit: User. BONUS(EUR)       500
Credit: User. WAGER (EUR) 500 («vager» -ə keçid)
Debit: User. WAGER(EUR)       500
Credit: Provider. Settlement (EUR) 500 (məzənnə silindi)Qalib €12. 5 → CASH
Debit: Provider. Settlement(EUR)  1250
Credit: User. CASH(EUR)         1250Hold debet (HOLD xidməti hesabı vasitəsilə satış)
Debit: User. CASH(EUR)       500
Credit: User. HOLD (EUR) 500 (hold tərəfindən yaradılmışdır)
-- ilə settle
Debit: User. HOLD(EUR)       500
Credit: Provider. Settlement(EUR)   500
-- ləğv edildikdə
Debit: User. HOLD(EUR)       500
Credit: User. CASH(EUR)         50014) Audit, dəyişməzlik və uyğunluq
Jurnal üçün WORM/immutability (obyekt saxlama/WAL arxivi).
Giriş meta jurnalları: kim oxudu/dəyişdirdi, kim əl ilə düzəlişlər etdi (yalnız əsaslandırma ilə «adjustment-posting» vasitəsilə).
GDPR/tənzimləyicilər: əməliyyatların 5-10 il müddətində saxlanması (yurisdiksiya üzrə), oyunçu üçün hesablaşmaların şəffaflığı (debet tarixi/veycer).
15) Arıza müqaviməti və DR
Multi-AZ tələb olunur; cüzdan üçün DR-region: zonada sync-replikasiya, regionda async; PITR aktivdir.
Promote standby - yalnız çek vərəqi ilə əl ilə (split-brain istisna).
Bərpa həftəlik yoxlanılır (test-restore), nəzarət hesabatları üzrə məbləğin müqayisəsi.
16) Cüzdan müşahidə
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`.
Alerts: bazarda PSP success düşməsi, 'hold _ expired _ rate' artımı, oyun provayderi rasinkron (təsdiq yoxdur> N min).
17) Test və keyfiyyətə nəzarət
PSP/oyun provayderləri ilə müqavilə testləri (vebhuk/imza).
Property-based pul testləri: debet məbləği = = hər Posting kreditlərin məbləği.
Fuzz/chaos: PSP/provayderin gecikmələri, vebhukların təkrarlanması, şəbəkə fappi.
Yük: burst dərəcələri (60-120 s), soaks (4-8 s), nəzarət 'queue _ lag' və p99.
18) Production-hazırlıq yoxlama siyahısı
- Ledger ikiqat qeyd, 'operation _ id' ilə Posting vasitəsilə bütün əməliyyatlar.
- Aydın spend-policies və prioritet qaydası (postinq ilə birlikdə).
- TTL/partial settle/expiry ilə Holds, bet/withdraw ilə əlaqə.
- Inbox/Outbox, HMAC-vebhuks, bütün sərhədləri idempotent.
- Fərdi CASH/BONUS/WAGER/FS/POINTS cüzdanları; valyuta bölünməsi.
- FX və kiçik vahidlərdə dairəvi; konvertasiya - ayrıca əməliyyat.
- hold/debit qədər məsuliyyətli oyun limitləri; uğursuzluq auditi.
- Oxu Cache (qısa TTL) + Kritik hərəkətlər əvvəl həqiqəti məcburi yoxlama.
- PITR/backup/DR skriptləri; əl promote, müntəzəm DR təlimləri.
- Dashboard/Alert SLI + texniki; WORM qeydləri və giriş meta jurnalları.
- Yük/xaos testləri; PSP/provayderlərlə reconciliation hesabatları.
Xülasə
Multi-wallet arxitekturası «çox balans nömrələri» deyil, ikili qeydlər, xərcləmə siyasətləri, rezerv və audit və oyunçular üçün şəffaf iz olan bir maliyyə sistemidir. Həqiqəti jurnalda saxlayın, hold və idempotentlik istifadə edin, cüzdan və valyutaları bölüşün, reconciliation və DR. cüzdan UX üçün sürətli, pul üçün dəqiq və pik yüklər və tənzimləyici yoxlamalar üçün sabit olacaq.
