Как устроены RGS — remote gaming servers
RGS (Remote Gaming Server) — это «сердце» онлайн-игр казино: здесь принимаются ставки, считаются исходы по математике, удерживаются и списываются средства, пишутся неизменяемые логи для аудита и отдаются компактные payload’ы клиенту (HTML5, натив, живые шоу). Корректный RGS сочетает: честность (server-authoritative исход), производительность (низкая латентность), идемпотентность и сертифицируемость.
1) Базовая архитектура
1.1 Логические слои
API-шлюз: аутентификация, rate limits, идемпотентные ключи, маршрутизация по играм/версиям.
Game Core: стейт-машина игры, вызовы RNG, маппинг исходов в символы/выплаты, правила фич (free spins, hold&spin).
Math Engine: таблицы выплат, веса/strip’ы, капы, симуляционные помощники.
RNG Service: CSPRNG/PRNG с политикой seed/stream, независимые потоки, HSM/secure seed storage.
Wallet Adapter: lock→settle транзакции, идемпотентность, мультивалюта/деноминации, налоговые поля.
Promo/Tournaments: free rounds, миссии, рейтинги; асинхронные коллбеки.
Jackpot Service: локальные/сетевые пулы, mystery/прогрессив, частоты срабатываний, капы.
Audit Log: WORM/меркл-цепочки, странслированный формат для лабораторий.
Telemetry: продуктовая аналитика (отдельно от аудита), алёрты и метрики SRE.
1.2 Технологический стек (типично)
Ядро: Go/Java/Kotlin/Node.js (stateless), RPC: REST/gRPC/WebSocket (live-игры).
Хранилища: PostgreSQL (транзакции), Redis (кэши/идемпотентность), Kafka/Pulsar (события).
Деплой: Kubernetes/Autoscaling, Multi-AZ, Blue/Green или Canary.
2) Жизненный цикл спина (sequence)
1. Bet.Place
Клиент → RGS: `gameId, betAmount, currency, idempotencyKey, deviceInfo`.
RGS: валидация лимитов/гео/юрисдикций → `wallet.lock(bet)`.
2. Outcome.Compute
RGS: `rng.draw()` в потоке игры → маппинг чисел в символы/ячейки → расчёт линий/кластеров → фичи/бонусы.
3. Settle
RGS: `wallet.settle(-bet + payout)`, маркирует бонус-кредиты/налоги, собирает джекпот-взнос.
4. Emit
Ответ клиенту: компактный outcome (позиции символов, выплаты по шагам, таймлайн фич), checksum/подпись.
5. Audit
Запись: `(request, seed/nonce, mathVersion, outcome, payout, walletTxId, merkleHash)` в неизменяемый лог.
3) RNG и математика
3.1 RNG
Политика seed/stream: отдельные потоки для барабанов, бонусов, джекпота; запрет повторного использования seed.
Алгоритмы: CSPRNG (CTR/HMAC-DRBG) или качественные PRNG (PCG/Xoshiro) под аудиторские требования.
Выборки: только rejection sampling/alias (Vose), никакого `%N`.
Время фиксирования исхода: до анимаций/визуала; timestamp и hash в аудите.
3.2 Math Engine
Конфиги (версионированные JSON/DSL): RTP-брейкдаун, полосы барабанов/веса, капы, ретриггеры, buy-feature (если разрешено).
Инварианты: неотрицательная выплата, соблюдение капов и лимитов, корректные границы индексов.
Симуляции: ≥10⁷–10⁸ спинов на релиз; RTP/волатильность/частоты и хвосты p99.9 в допусках.
Миграции: смена математики → новая `mathVersion`, перекладка сидов и обязательный регресс-пакет.
4) Кошелёк и транзакции
4.1 Контракт
Двухфазный сценарий: `lock(bet) → settle(net)`; идемпотентные ключи и TTL.
Валюты/деноминации: точность денежных единиц, округления, фиксация курса (если кросс-курс).
Пограничные кейсы: таймауты, частичные отказы — игра не меняет исход; повторная попытка сеттла до успеха/компенсации.
4.2 Идемпотентность
5) Промо, фриспины, турниры
Free Rounds API: выдача пакетов спинов, `PromoWallet` (учёт бонусных средств отдельно), приоритет списаний.
Миссии/ивенты: синхронные метрики в Telemetry + асинхронные коллбеки в CRM/миссионный движок.
Турниры: публикация событий в стрим (`score:update`), idempotent-ингест у лидеборда.
6) Джекпоты
Типы: локальные фикс/прогрессив, сетевые прогрессивы, mystery.
Модель: доля от ставки → пул; триггеры — вероятностные/диапазонные/таймерные; капы/флооры; анти-снайпинг.
Консистентность: согласованность пулов при мульти-регионе (CRDT/двухфазная фиксация), отдельный аудит.
7) Логи, аудит и соответствие
WORM: write-once-read-many, меркл-цепочки, хэш-подписи пакетов логов.
Разделение: Audit (юридически значимые записи) ≠ Telemetry (продукт/перфоманс).
Реплеи: воспроизведение раунда по `(seed, step, mathVersion)`.
Отчётность: форматы GLI/eCOGRA/BMM; экспорт по регуляторным API/файлам; ретеншн-политики.
8) Безопасность и приватность
Аутентификация: JWT/MTLS между платформой и RGS; подписи ответов.
Изоляция арендаторов: multi-tenant, лимиты по доменам/ключам, отдельные пулы RNG.
CSP/DoS-защита: лимиты, канареечные ключи, «холодные» блокировки по гео/юрисдикции.
PII-минимизация: храним только необходимые идентификаторы; шифрование «на покое» и в канале.
Change-control: 4-глазый релиз математики, подписанные артефакты, хэш-манифесты.
9) Масштабирование, отказоустойчивость, регионы
Stateless-ядро: горизонтальный автоскейл; sticky-sessions только на период сложных бонусов (по токену).
Multi-AZ/Multi-Region: актив-актив для чтений/телеметрии, актив-пассив или конфликт-free для кошелька/джекпотов.
Квоты: пер-игра/пер-арендатор TPS, пулы соединений к кошельку, backpressure.
Disaster Recovery: RPO/RTO целевые, журналы репликаций, план регламентированных switchover/drill.
10) Мониторинг и SRE
SLO/SLA: p95/p99 для `Spin`, ошибка сеттла, таймауты кошелька, crash-free rate live-сцен.
Метрики: TPS по играм, отклонение RTP от эталона (контрольные карты), частота бонусов, latency кошелька, перегрев пулов RNG.
Логи перфоманса: slow-query, GC/heap, очереди.
Алёрты: отклонение RTP/частот, рост 5xx, «застревание» идемпотентных ключей, дрифт джекпота.
11) Интерфейсы RGS (минимальный контракт)
11.1 Spin API (схема, упрощённо)
json
POST /v1/games/{gameId}/spin
{
"playerId": "p-123", "roundId": "r-456", "stake": { "amount": 100, "currency": "EUR" }, "idempotencyKey": "p-123:r-456:1", "context": { "jurisdiction": "MT", "device": "web", "promo": "FR-25" }
}
Response
json
{
"outcome": {
"symbols": "...compact-encoded...", "wins": [{ "line": 7, "amount": 250 }], "features": [{ "type": "freespins", "awarded": 10 }]
}, "payout": { "amount": 150, "currency": "EUR" }, "walletTxId": "wt-789", "mathVersion": "1.8.2", "auditHash": "merkle:abc..."
}
11.2 Free Rounds
`POST /promo/freerounds/issue`- `POST /promo/freerounds/consume` (идемпотентно; учёт бонус-кошелька)
11.3 Jackpot
`POST /jackpot/contribute`- `POST /jackpot/try-win` (атомарно с сеттлом)
12) Юрисдикции и RG (Responsible Gaming)
Фичефлаги: отключение авто-спинов/buy-feature, скорость, минимальный RTP — на уровне игры и RGS.
RG-сигналы: лимиты депозитов/времени, «реалити-чеки», самоисключение — RGS уважает стоп-флаги платформы.
Маркетинг-гейт: не отправлять промо-коллбеки по игрокам в RG-режимах.
13) Производительность: ориентиры
Цели: p95 Spin API ≤ 60–120 мс (без внешних провайдеров), p99 ≤ 200–300 мс; ошибка сеттла < 10⁻⁴.
Экономия: компактные payload’ы (бит-пэкинг), кэширование неизменяемых конфигов, pre-warm RNG, батч коллбеков миссий.
Тесты: нагрузочные (ступенчатые/хаос), soak-сутки/недели, профайлинг GC и аллокаций.
14) Частые ошибки и анти-паттерны
`%N` при маппинге → bias. Использовать alias/rejection.
Решение исхода на клиенте → споры/tamper/провал сертификации.
Смешение Audit и Telemetry → невозможность доказать корректность.
Отсутствие идемпотентности → дубли выплаты при ретраях.
Общий RNG-поток для всего → скрытые корреляции.
Изменение математики «на лету» без версионирования → недостоверные логи/страйки от регуляторов.
Долгие внешние RPC в критическом пути спина → пиковые лейтенси/таймауты.
15) Дорожная карта внедрения RGS (референс 12–20 недель)
1. Discovery: требования платформ/юрисдикций, SLA, интеграции кошелька/джекпота.
2. MVP архитектура: stateless ядро, RNG/Math, WalletAdapter, Audit.
3. Игровое ядро: стейт-машина, DSL конфигов, реплеи.
4. Идемпотентность/транзакции: контракты с кошельком, тесты отказов.
5. Промо/джекпоты: интеграции и анти-снайпинг.
6. Безопасность: подписи, WORM, доступы, multi-tenant.
7. Нагрузка/симуляции: 10⁸-симы, LT/soak, хаос-тесты.
8. Сертификация: пакет RNG/математики/логов, dry-run экспорты.
9. Канарейка: 1–5% трафика, guardrails (RTP-дрейф, частоты, 5xx).
10. Масштабирование и DR: мултирегион, отработка switchover.
16) Большой чек-лист RGS
Честность и математика
- Server-authoritative исход, фикс до анимации
- Независимые RNG-потоки, alias/rejection, seed-политика
- Симуляции ≥10⁷–10⁸; допуски RTP/частот/хвостов
Транзакции
- Lock→Settle, идемпотентные ключи, ретраи безопасны
- Мультивалюта/деноминации, налоги, отчётность
- Джекпот атомарен с сеттлом
Аудит и реплеи
- WORM/меркл-цепочки, экспорт для лабораторий
- Реплей по `(seed, step, mathVersion)`
- Разделение Audit/Telemetry
Безопасность
- MTLS/JWT, подписи ответов, секреты в HSM/менеджере
- Multi-tenant изоляция, rate limits, DoS-защита
- PII-минимизация, шифрование, access-policies
Производительность
- p95/p99 SLA, autoscaling, backpressure
- Компактные payload’ы, кэши, горячие пулы RNG
- Нагрузочные/soak/хаос-тесты
Юрисдикции и RG
- Фичефлаги регионов, минимальные RTP/скорости
- RG-стопы/лимиты/самоисключение уважаются
- Прозрачные правила промо/фриспинов
RGS — это комбинация криптографически корректной случайности, детерминированной математики, надёжных транзакций и аудитопригодных логов. Побеждает архитектура, где исход фиксируется до визуала, транзакции идемпотентны, логи неизменяемы, а платформа масштабируется горизонтально и выдерживает регуляторные требования. Такой RGS делает игры честными, быстрыми и устойчивыми — от первой ставки до миллиардного спина.