Casino Platform Sizing

Документация по ресурсам и масштабированию 22 микросервисов: минимальные требования, корреляция с DAU, узкие места и интерактивный калькулятор.

Сервисов
22
Heavy: 6, Medium: 10, Light: 6
Тиры DAU
10 → 1M
6 уровней с разной архитектурой
@ 100k DAU
~470 GB
200 cores, 7 TB/год disk
@ 1M DAU
~2 TB
1000 cores, 70 TB/год

С чего начать

Топ-5 узких мест роста

ГраницаЧто ломаетсяРешение
1k → 10k DAUPostgres connections > 200PgBouncer (transaction mode)
10k → 100k DAUBI/stats aggregationsClickHouse + materialized views
100k → 1M DAUWallet single primarySharding по user_id
100k → 1M DAUAuth sessions в DBRedis-only / JWT stateless
T3+ (regulatory)Risk-management 7yr retentionПартиции + S3/Glacier

Распределение нагрузки по сервисам

СервисКлассRPS shareКеш-хитq/req

Все цифры — оценка с погрешностью ±30%. Перед production обязателен нагрузочный тест.
Сгенерировано из методологии в ci-templates/docs/sizing/.

🧮 Калькулятор ресурсов

Введи DAU и параметры профиля юзера — получишь требования по RAM/CPU/Disk + DB QPS на каждый сервис.

Параметры

CCU:
RPS avg:
RPS peak:

Итого по платформе

Total RAM
Total CPU
Disk/yr
DB read QPS
DB write QPS
Pool sum

Per-service сайзинг

Service RPS peak App RAM (GB) App CPU DB rd QPS DB wr QPS Pool Replicas Total RAM (GB) Total CPU

Сводная таблица ресурсов по всем сервисам

Применение методологии (00-methodology.md) к профилям сервисов (profiles/*.md) с распределением RPS из 10-rps-distribution.md.

Все цифры — суммарно: app + Postgres + Redis на сервис. Если сервис делит общую базу с другим — учитывай это отдельно.
Допущения:
- Включён 30% headroom для GC, шумных соседей, кратковременных пиков
- PG/Redis = standalone до 10k DAU, replica/cluster — выше
- CGO_ENABLED=1 (где есть)
- Buffer = +20% RAM на peak burst

---

Тиры архитектуры

Тир DAU Pattern
T0 ≤ 10 demo, dev, smoke test
T1 ≤ 1k small operator
T2 ≤ 10k medium operator
T3 ≤ 100k large operator
T4 ≤ 1M enterprise / multi-region

---

Per-Service Sizing — суммарно (app + DB + Redis)

casino-core-service (medium)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.3 80 MB 0.1 256 MB 0.5 1 GB 64 MB 0.4 GB 0.6
1k 8 200 MB 0.3 1 GB 1 5 GB 256 MB 1.5 GB 1.3
10k 80 700 MB 1.5 2 GB 2 30 GB 512 MB 3.2 GB 3.5
100k 800 4 GB ×2 4 8 GB 4 300 GB 4 GB 20 GB 12
1M 8000 16 GB ×4 16 32 GB ×2 16 3 TB 16 GB ×2 128 GB 80

casino-game-processing-service (heavy — orchestrator)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.3 100 MB 0.2 256 MB 0.5 1 GB 64 MB 0.5 GB 0.7
1k 6.4 250 MB 0.5 1 GB 1 8 GB 256 MB 1.5 GB 1.5
10k 64 1 GB 2 4 GB 4 60 GB 1 GB 6 GB 6
100k 640 4 GB ×3 9 16 GB 8 600 GB 4 GB 32 GB 18
1M 6400 16 GB ×6 36 64 GB ×2 (sharded) 32 6 TB 16 GB ×2 224 GB 150

casino-wallet-service (heavy — financial critical)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.5 100 MB 0.2 512 MB 0.5 1 GB 64 MB 0.7 GB 0.7
1k 5 300 MB 0.5 2 GB 1 10 GB 256 MB 2.5 GB 1.5
10k 48 1 GB 2 8 GB 4 100 GB 1 GB 10 GB 6
100k 480 4 GB ×3 9 32 GB primary + 32 GB replica 16 1 TB 8 GB 96 GB 40
1M 4800 16 GB ×6 36 128 GB sharded ×2 + replicas 64 10 TB 32 GB cluster 440 GB 220

casino-auth-service (heavy — token validation)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.16 80 MB 0.1 256 MB 0.5 0.5 GB 64 MB 0.4 GB 0.6
1k 1.6 200 MB 0.3 1 GB 1 2 GB 256 MB 1.5 GB 1.3
10k 16 600 MB 1 2 GB 2 20 GB 1 GB 3.6 GB 3
100k 160 2 GB ×2 4 8 GB primary + replica 4 200 GB 4 GB 18 GB 12
1M 1600 8 GB ×4 16 32 GB primary + 2 replicas 16 2 TB 16 GB cluster 96 GB 64

casino-bonuses-service (heavy — every bet)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.32 100 MB 0.2 512 MB 0.5 1 GB 128 MB 0.7 GB 0.7
1k 3.2 300 MB 0.5 2 GB 2 10 GB 512 MB 3 GB 2.5
10k 32 1.5 GB 2 8 GB 4 100 GB 2 GB 12 GB 6
100k 320 4 GB ×3 8 32 GB 8 1 TB 8 GB 52 GB 24
1M 3200 16 GB ×4 32 64 GB primary + replica 32 10 TB 32 GB cluster 224 GB 130

casino-payment-service (heavy — PSP orchestrator)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.03 80 MB 0.1 256 MB 0.5 0.5 GB 64 MB 0.4 GB 0.7
1k 0.3 200 MB 0.3 1 GB 1 5 GB 256 MB 1.5 GB 1.5
10k 3 500 MB 0.7 2 GB 2 50 GB 512 MB 3 GB 2.7
100k 32 2 GB ×2 3 8 GB 4 500 GB 2 GB 16 GB 9
1M 320 4 GB ×3 12 32 GB primary + replica 16 5 TB 8 GB 80 GB 45

casino-bi-service (analytics — write-heavy + slow reads)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0 100 MB 0.1 1 GB 1 5 GB 64 MB 1.2 GB 1.2
1k 0 250 MB 0.3 4 GB 2 50 GB 128 MB 4.5 GB 2.5
10k 0 1 GB 1 16 GB 4 500 GB 256 MB 18 GB 6
100k 0 2 GB 2 64 GB 16 5 TB 1 GB 70 GB 20
1M 0 4 GB 4 → ClickHouse: 64 GB / 32 cores / 50 TB 4 GB 120 GB 40
BI > 10k DAU — мигрировать на ClickHouse. Postgres перестаёт справляться с aggregation queries.

casino-stats-service (write-heavy, аналог BI на меньшем масштабе)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.16 80 MB 0.1 256 MB 0.5 1 GB 64 MB 0.4 GB 0.6
1k 1.6 200 MB 0.3 2 GB 1 20 GB 256 MB 2.5 GB 1.5
10k 16 600 MB 1 8 GB 4 200 GB 512 MB 9 GB 5
100k 160 2 GB ×2 4 32 GB 8 2 TB 2 GB 40 GB 15
1M 1600 8 GB ×3 12 → ClickHouse: 32 GB / 16 cores / 20 TB 8 GB 80 GB 35

casino-achievement-service (write-heavy через Kafka)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.06 80 MB 0.1 256 MB 0.5 1 GB 64 MB 0.4 GB 0.6
1k 0.6 200 MB 0.3 1 GB 1 10 GB 256 MB 1.5 GB 1.3
10k 6 600 MB 1 4 GB 2 100 GB 512 MB 5 GB 3
100k 64 2 GB ×2 3 16 GB 4 1 TB 2 GB 22 GB 9
1M 640 8 GB ×3 9 64 GB partitioned 16 5 TB partitioned 8 GB 96 GB 35

casino-back-office-service (admin only)

Особенность: RPS почти не растёт от DAU юзеров — только от количества админов (~50-200 на крупного клиента).
DAU App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
любой ≤ 100k 256 MB 0.5 1 GB 1 50 GB (audit_log) 128 MB 1.4 GB 1.5
1M 512 MB 1 4 GB 2 200 GB 256 MB 5 GB 3

casino-config-service (read-heavy, агрессивный кеш)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.01 50 MB 0.05 256 MB 0.5 0.1 GB 32 MB 0.3 GB 0.6
1k 0.1 100 MB 0.1 256 MB 0.5 0.5 GB 64 MB 0.5 GB 0.6
10k 1 200 MB 0.2 512 MB 0.5 1 GB 128 MB 0.9 GB 0.7
100k 10 400 MB 0.5 1 GB 1 5 GB 256 MB 1.7 GB 1.5
1M 96 1 GB ×2 2 2 GB 1 10 GB 1 GB 5 GB 3

casino-jackpot-service (atomic counters, kafka consumer)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.10 80 MB 0.1 256 MB 0.5 0.5 GB 64 MB 0.4 GB 0.6
1k 1 150 MB 0.2 512 MB 0.5 2 GB 128 MB 0.8 GB 0.7
10k 10 400 MB 0.5 1 GB 1 20 GB 256 MB 1.7 GB 1.5
100k 100 1 GB ×2 2 4 GB 2 200 GB 1 GB 8 GB 4
1M 960 4 GB ×3 8 16 GB primary + replica 8 2 TB 4 GB 40 GB 20

casino-tournament-service (leaderboards via Redis)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.06 80 MB 0.1 256 MB 0.5 0.5 GB 64 MB 0.4 GB 0.6
1k 0.6 150 MB 0.2 512 MB 0.5 2 GB 256 MB 0.9 GB 0.7
10k 6 400 MB 0.5 1 GB 1 20 GB 1 GB 2.5 GB 1.5
100k 64 1 GB ×2 2 4 GB 2 200 GB 4 GB 14 GB 5
1M 640 4 GB ×3 8 16 GB 8 2 TB 16 GB 64 GB 24

casino-segmentation-service (5-second recalc loop)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.06 80 MB 0.1 256 MB 0.5 0.1 GB 64 MB 0.4 GB 0.6
1k 0.6 150 MB 0.2 512 MB 0.5 1 GB 128 MB 0.8 GB 0.7
10k 6 400 MB 0.7 2 GB 2 10 GB 256 MB 2.7 GB 2.7
100k 64 1.5 GB 2 8 GB 4 100 GB 1 GB 11 GB 6
1M 640 4 GB ×2 8 32 GB 16 1 TB 4 GB 44 GB 24

casino-risk-management-service (sync withdraw path)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.06 80 MB 0.1 256 MB 0.5 0.5 GB 64 MB 0.4 GB 0.6
1k 0.6 200 MB 0.3 1 GB 1 5 GB 256 MB 1.5 GB 1.3
10k 6 600 MB 1 4 GB 2 50 GB 512 MB 5 GB 3
100k 64 2 GB ×2 3 16 GB 4 500 GB 2 GB 22 GB 9
1M 640 8 GB ×3 9 64 GB (partitioned, 7yr retention) 16 5 TB 8 GB 96 GB 35

casino-sportsbook-service (Digitain webhook)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Redis Total RAM Total CPU
10 0.13 80 MB 0.1 256 MB 0.5 0.5 GB 0.3 GB 0.6
1k 1.3 200 MB 0.3 1 GB 1 5 GB 1.2 GB 1.3
10k 13 600 MB 1 4 GB 2 50 GB 256 MB (нужно добавить) 5 GB 3
100k 130 2 GB ×2 3 16 GB 4 500 GB 1 GB 20 GB 9
1M 1280 8 GB ×3 12 64 GB primary + replica 16 5 TB 4 GB 88 GB 45

casino-balancer (geo-redirect)

DAU App RAM App CPU PG RAM PG CPU PG Disk/yr Total RAM Total CPU
10 80 MB 0.1 256 MB 0.3 0.1 GB 0.3 GB 0.4
1k 150 MB 0.2 256 MB 0.3 0.5 GB 0.4 GB 0.5
10k 300 MB 0.5 512 MB 0.5 2 GB 0.8 GB 1
100k 1 GB 2 1 GB 1 20 GB 2 GB 3
1M 4 GB ×2 8 4 GB 2 200 GB 12 GB 10
Это лишь redirect-сервис, использует in-memory GeoIP — RPS легко масштабируется горизонтально.

casino-store-service (in-app store)

DAU RPS peak App RAM App CPU PG RAM PG CPU Redis Total RAM Total CPU
10 0.06 60 MB 0.05 256 MB 0.3 32 MB 0.3 GB 0.4
1k 0.6 100 MB 0.1 512 MB 0.5 64 MB 0.7 GB 0.6
10k 6 250 MB 0.3 1 GB 1 128 MB 1.4 GB 1.3
100k 64 1 GB 1 4 GB 2 512 MB 6 GB 3
1M 640 4 GB ×2 6 16 GB 4 2 GB 26 GB 10

casino-partner-service (affiliate, polling-based)

DAU RPS peak App RAM App CPU PG RAM PG CPU PG Disk/yr Total RAM Total CPU
10 0.02 60 MB 0.05 256 MB 0.3 0.5 GB 0.3 GB 0.4
1k 0.16 100 MB 0.1 512 MB 0.5 5 GB 0.6 GB 0.6
10k 1.6 250 MB 0.3 1 GB 1 50 GB 1.3 GB 1.3
100k 16 1 GB 1 4 GB 2 500 GB 5 GB 3
1M 160 4 GB ×2 4 16 GB 8 5 TB (нужна архивация) 24 GB 12

casino-referral-service

DAU App RAM App CPU PG RAM PG CPU PG Disk/yr Total RAM Total CPU
10 60 MB 0.05 256 MB 0.3 0.1 GB 0.3 GB 0.4
1k 100 MB 0.1 256 MB 0.3 0.5 GB 0.4 GB 0.4
10k 200 MB 0.2 512 MB 0.5 5 GB 0.7 GB 0.7
100k 800 MB 1 2 GB 1 50 GB 3 GB 2
1M 3 GB 4 8 GB 2 500 GB 11 GB 6

casino-notifications-service (multi-channel fan-out)

Heavy: 4 Kafka consumer groups, 6 каналов, sync вызовы провайдеров.
DAU App RAM App CPU PG RAM PG CPU Redis Total RAM Total CPU
10 100 MB 0.1 256 MB 0.5 64 MB 0.4 GB 0.6
1k 200 MB 0.3 512 MB 0.5 128 MB 0.8 GB 0.8
10k 600 MB 1 1 GB 1 256 MB 1.9 GB 2
100k 2 GB ×2 3 4 GB 2 1 GB 9 GB 5
1M 8 GB ×3 12 16 GB 4 4 GB 44 GB 16

---

Итого по платформе (без избыточности — single instance)

DAU Сумма RAM Сумма CPU Disk/год Архитектура
10 ~10 GB ~10 cores ~10 GB T0 — одна VM (8 vCPU / 16 GB / 100 GB)
1k ~25 GB ~22 cores ~50 GB T1 — одна VM (16 vCPU / 32 GB / 250 GB) или 2 VM (app + infra)
10k ~110 GB ~63 cores ~600 GB T2 — 3-5 VM (8 vCPU / 32 GB), отдельно DB и Redis
100k ~470 GB ~200 cores ~7 TB T3 — 10-20 VM или K8s, replicas, PgBouncer обязателен
1M ~2 TB ~1000 cores ~70 TB T4 — Kubernetes, шардинг, ClickHouse для аналитики, multi-AZ

---

С учётом репликации и HA

Множители для T2+:

  • PG: ×2 (primary + replica) или ×3 (primary + 2 replica)
  • App: ×N подов для HA (минимум ×2)
  • Redis: ×2 (master + replica) или ×6 (cluster 3+3)
  • Kafka: 3 брокера (для T3+)

Финальный множитель к "сумме single instance": ~2.5× для T3, ~4× для T4.

DAU Single instance + HA + Резерв 30% **Итого нужно купить**
10k 110 GB / 63 cpu 220 GB / 110 cpu 285 GB / 145 cpu 5-7 VM × 64 GB / 32 cpu
100k 470 GB / 200 cpu 1.2 TB / 500 cpu 1.5 TB / 650 cpu 15-25 VM × 64 GB / 32 cpu
1M 2 TB / 1000 cpu 6 TB / 2.5k cpu 8 TB / 3.3k cpu K8s ~80 nodes × 96 GB / 48 cpu

---

Запросы к БД и Redis

Самая важная метрика для PG — DB QPS = HTTP RPS × queries_per_request. Часть запросов идёт мимо HTTP — через Kafka consumer'ов.

DB read QPS платформы (после кеша)

DAU Total HTTP RPS DB read QPS DB write QPS Redis QPS
10 0.3 0.2 0.4 0.4
100 3.2 2.6 4.3 4
1k 32 26 43 40
10k 320 256 425 405
100k 3 200 2 556 4 254 4 050
1M 32 000 25 562 42 535 40 500
Write QPS преобладает над read в этой платформе — нагрузка финансово-транзакционная (wallet, bonuses, stats события). Это разворачивает обычные предположения "80% read / 20% write" в casino.

Pool sum (суммарно по всем сервисам)

DAU Pool sum Действие
10 210 PgBouncer обязателен (минимум 10 conn × 21 сервис)
1k 210 PgBouncer обязателен
10k 210 PgBouncer обязателен
100k 285 PgBouncer обязателен
1M 1 422 PgBouncer + 1 на pool на app pod

Топ-3 сервиса по connections @ 1M DAU:

  1. game-processing — 519 connections
  2. wallet — 389 connections
  3. bonuses — 138 connections

DB QPS по сервисам @ 100k DAU

Сервис RPS Read QPS Write QPS Pool Доминирующий запрос
game-processing 640 1 024 1 282 52 Multi-table session updates
wallet 480 288 1 441 39 INSERT tx + UPDATE balance + SELECT FOR UPDATE
bonuses 320 288 323 14 Wagering progress + active bonuses
sportsbook 128 269 257 10 Webhook → multi-table
core 800 384 80 10 CMS list+detail (80% cached)
stats 160 0 199 10 Event ingest (Kafka)
achievement 64 38 133 10 Progress check+update
jackpot 96 19 98 10 Pool counter
auth 160 12 11 10 Token/session lookup (95% cached)

Что переходит грань "PG не справится"

Граница Что происходит Решение
~150 conn total PG default max_connections issue PgBouncer transaction mode
game-proc 50+ conn Single primary не успевает Read replica для не-критичных reads
wallet 100+ conn Lock contention на balance row Sharding по user_id
bi 100+ heavy QPS Aggregation queries блокируют writes ClickHouse + materialized views
1k+ writes/sec в одну таблицу WAL throughput SSD NVMe + WAL на отдельный диск

---

Топ-5 расходных статей

  1. PostgreSQL master (wallet, bonuses, bi) — самый дорогой компонент
  2. Kafka cluster (3+ брокера, 30 топиков) — стабильно ~10% стоимости
  3. Redis (jackpot counters, leaderboards, session, cache) — растёт линейно
  4. ClickHouse / analytics DB — обязателен для T3+ (вместо PG для bi/stats)
  5. Egress traffic — для T4 значимая статья (CDN сильно помогает)

---

Что точно ЛОМАЕТСЯ при росте

DAU Что ломается Как фиксить
1k → 10k Postgres connections > 200 PgBouncer (transaction pooling)
10k → 100k bi/stats Postgres aggregations ClickHouse, materialized views
100k → 1M wallet single primary (write contention) Sharding по user_id, async writes
100k → 1M Kafka topic throughput (game-action) Партиции 32+, отдельный кластер для analytics
100k → 1M auth Postgres sessions Redis-only sessions, JWT stateless
100k → 1M risk-management retention (5-7 лет) Партиционирование + холодное хранение (S3/Glacier)

Методология расчёта ресурсов

Этот документ описывает формулы и допущения, по которым считаются ресурсы для каждого сервиса (SIZING.md в репо сервиса) и для всей платформы (90-summary.md).

---

Профиль пользователя (casino)

Метрика Значение Комментарий
CCU / DAU 8% Concurrent users / Daily active users — типичное значение для casino, slot-heavy
Сессий на DAU/день 2.5 Среднее число логинов в день
Длина сессии 18 мин Среднее время онлайн
Действий в минуту (онлайн) 8 Спин/клик/ставка/просмотр баланса (peak — 12)
Депозитов на DAU/день 0.15 15% юзеров делают депозит ежедневно
Выплат на DAU/день 0.08 8% юзеров делают вывод ежедневно
Турниров активных 0.3 Доля юзеров в турнирах
Бонусов активных на юзера 1.2 Среднее число активных бонусов
Чат сообщений / онлайн / мин 0.5 Активность в чате
Peak coefficient 3.0× Часовой пик к среднесуточному

Перевод DAU → RPS

RPS_avg = CCU × actions_per_minute / 60
       = (DAU × 0.08) × 8 / 60
       ≈ DAU × 0.0107

RPS_peak = RPS_avg × 3.0
        ≈ DAU × 0.032

Таблица RPS по тирам:

DAU CCU RPS avg RPS peak
10 1 0.1 0.3
100 8 1.1 3.2
1k 80 11 32
10k 800 107 320
100k 8 000 1 067 3 200
1M 80 000 10 670 32 000

Распределение RPS по сервисам (средние коэффициенты по индустрии):

Сервис Доля RPS Обоснование
auth 5% Только логин/refresh — кэшируется
core 25% CMS, баннеры, чат — каждое открытие
game-processing 20% Запуск игры, состояние
wallet 15% Каждый спин трогает баланс
bonuses 10% Проверка активных бонусов
stats 5% Сохранение событий
остальные 16 20% Делятся пропорционально

---

Сайзинг Go-сервиса

Базовая модель

Memory = idle_baseline + per_connection × concurrent_conns + per_RPS × RPS
CPU    = idle_baseline + per_RPS × RPS / efficiency_per_core

Числа по умолчанию (Go 1.25+, Gin/chi, sqlx/pgx)

Параметр Light service Medium Heavy
idle_RAM (MB) 40 80 150
RAM_per_concurrent_conn (KB) 20 40 80
RAM_per_RPS (MB) 0.5 1 2
idle_CPU 0.05 0.1 0.2
RPS_per_core (sustained) 2000 800 250

Что классифицирует тяжесть:

  • Light: простой CRUD, мало join'ов, мало бизнес-логики (≤ 30 routes, ≤ 15k LoC)
  • Medium: умеренные join'ы, кеш, валидация, события Kafka (30-150 routes, 15-50k LoC)
  • Heavy: сложная бизнес-логика, много join'ов, агрегаты, JSONB, тяжёлый Kafka (>150 routes, >50k LoC)

Концурентность

concurrent_conns = RPS_peak × avg_latency_seconds × safety_factor

Где:

  • avg_latency = 50ms (light) / 100ms (medium) / 200ms (heavy)
  • safety_factor = 2.0

---

Запросы к БД (Queries Per Request)

Самая важная метрика для сайзинга PG — это DB QPS = RPS × queries_per_request, а не просто HTTP RPS.

Таблица queries_per_request по типам сервисов

Тип операции SELECT INSERT/UPDATE SELECT FOR UPDATE Avg latency Пример
Просто кеш-чтение 1 0 0 1-3ms config get
CRUD list 2-3 0 0 3-8ms core list news
CRUD detail+children 3-5 0 0 5-15ms core get story+media
Простая запись 0 1-2 0 5-10ms stats event ingestion
Запись с проверкой 1-2 1-2 0 8-15ms bonus eligibility+grant
Финансовая транзакция 1-2 2-4 1 10-30ms wallet debit
Сложная аналитика 1 (heavy) 0 0 100-2000ms bi reports

Профиль queries_per_request по сервису

Сервис Avg q/req DB read DB write Redis q/req Кеш hit % Доминирующий запрос
auth 1.5 1.5 0 1 95% session lookup (cache→DB miss)
core 2.5 2.4 0.1 0.5 80% CMS list/detail с join media
game-processing 6 4 2 1 60% game session state + multi-update
wallet 5 2 3 1 70% balance read + tx insert + audit
bonuses 4 3 1 2 70% active bonus + wagering update
payment 4 2 2 0.5 30% order lookup + tx insert + idempotency
stats 1.2 0 1.2 0 event ingest (Kafka driven)
bi 0.5 0.5 (HEAVY) 0 0.1 20% aggregation queries
achievement 3 1 2 0.5 40% progress check+update
back-office 4 4 0 1 90% report queries (read replica)
config 0.05 0.05 0 1 99%+ почти всё из кеша
jackpot 2 1 1 1 80% pool check + INCR (или Redis)
tournament 2.5 1.5 1 2 90% leaderboard ZSET + DB rank persist
segmentation 3 2 1 0.5 70% segment match + recalc
risk-management 3 2 1 1 80% scoring lookup + alert insert
sportsbook 5 3 2 0.2 30% webhook → multi-table update
balancer 1 1 0 0 domain lookup (часто из памяти)
store 4 2 2 0.5 60% catalog + purchase tx
partner 2 1.5 0.5 0.2 50% tracking insert + lookup
referral 2 1.5 0.5 0 0% link lookup + insert
notifications 2 1 1 1 70% template fetch + log insert

Расчёт DB QPS

DB_QPS_peak = RPS_peak × queries_per_request × (1 - cache_hit_rate)

# с разбивкой:
DB_read_QPS  = RPS_peak × q_read  × (1 - cache_hit_rate)
DB_write_QPS = RPS_peak × q_write × 1.0  # writes не кешируются
Примечание о Kafka consumers: многие сервисы (stats, achievement, bi, bonuses, segmentation, risk-management) делают БОЛЬШЕ записей через Kafka consumers, чем через HTTP. Для них DB write QPS считается отдельно: events_per_second × q_write_per_event.

Готовая таблица DB QPS пиковых для топ-сервисов

Сервис 1k DAU 10k DAU 100k DAU 1M DAU
wallet (5 q/r, 70% cache) 7 QPS 72 QPS 720 QPS 7 200 QPS
bonuses (4 q/r, 70% cache) 4 QPS 38 QPS 380 QPS 3 800 QPS
wallet writes (3 w/r) 14 wQPS 144 wQPS 1 440 wQPS 14 400 wQPS
game-processing (6 q/r, 60%) 15 QPS 154 QPS 1 536 QPS 15 360 QPS
auth (1.5 q/r, 95% cache) 0.1 QPS 1.2 QPS 12 QPS 120 QPS
stats (Kafka writes) ~50 wQPS ~500 wQPS ~5k wQPS ~50k wQPS
bi (heavy aggs, low rate) 1 QPS 10 QPS 100 QPS 1k QPS (но 100ms+ each)

Connection Pool Sizing

pool_size = MAX(10, CEIL(DB_QPS × avg_query_latency × safety))

С safety = 1.5 и avg_query_latency:

  • light read = 5ms
  • write = 10ms
  • SELECT FOR UPDATE = 20ms
  • aggregation = 200ms

Минимум pool на сервис = 10, иначе burst заблокирует все коннекты.

Сервис DAU 10k DAU 100k DAU 1M
auth 10 (min) 10 20
core 10 (min) 25 100
wallet 25 100 500 (sharded)
bonuses 15 60 300
game-processing 25 150 800
bi 10 (heavy q) 25 (heavy q) 50 (отдельный read pool)
TOTAL ALL services ~150 ~600 ~3000+
Critical: PG max_connections = 200 по умолчанию. После ~150 conns — обязательно PgBouncer в transaction mode (даёт 10-50× connections без роста реальных PG worker'ов).

Redis ops/sec

Redis_QPS = RPS_peak × redis_ops_per_request

Redis легко держит 100k+ QPS на одном инстансе для мелких ключей. Узкое место — сеть и сериализация.

DAU Redis QPS (платформа) Архитектура
1k ~50 1 instance
10k ~500 1 instance
100k ~5k 1 instance с replica
1M ~50k Cluster или partitioning по namespace (session/cache/queue/leaderboard отдельно)

---

Сайзинг PostgreSQL

Базовая модель

RAM_pg = shared_buffers + work_mem × max_connections × concurrent_queries_ratio + WAL + OS_cache
shared_buffers = 25% от total RAM
effective_cache_size = 50-75% от total RAM
work_mem = 4-16 MB (зависит от запросов)
max_connections = max(20, ceil(RPS_peak × 1.2 × num_services_per_db))

Сайзинг на основании юзеров

DAU shared_buffers work_mem total RAM CPU Disk (год)
10 64 MB 4 MB 256 MB 0.5 1 GB
100 128 MB 4 MB 512 MB 1 2 GB
1k 256 MB 4 MB 1 GB 1 5 GB
10k 512 MB 8 MB 2 GB 2 30 GB
100k 2 GB 8 MB 8 GB 4 300 GB
1M 16 GB 16 MB 64 GB 16 3 TB (с шардингом)

Storage

Storage_GB = (rows_per_user_per_day × avg_row_KB × DAU × retention_days) / 1024 / 1024 + indexes_overhead (~30%)

Типичные ставки записи:

  • transactions — 50 строк / DAU / день (спины + депозиты + бонусы)
  • bets — 200 строк / DAU / день
  • events (analytics) — 500 строк / DAU / день (часто переносится в ClickHouse)
  • audit_log — 30 строк / DAU / день

Connections

max_connections = N_services × pool_size_per_service

Типично pool = 10-25 на сервис. При 22 сервисах × 25 = до 550 коннектов.

Если коннектов > 200 — обязательно ставить PgBouncer (transaction pooling).

---

Сайзинг Redis

Базовая модель

RAM_redis = baseline (5 MB) + sum(cached_keys × avg_size) + replication_buffer (10%)

Что обычно кешируется

Тип кеша Ключ Размер TTL Хит-рейт
Session session:{userId} 2 KB 24h 95%
User profile user:{userId} 3 KB 1h 90%
Wallet balance wallet:{userId} 0.5 KB 30s 80%
Game catalog games:list 200 KB 5min 99%
Bonus active bonus:user:{id} 1 KB 5min 70%
Rate limiter ratelimit:{ip}:{path} 0.1 KB 1min

Сайзинг по DAU

DAU Redis RAM CPU Сценарий
10 64 MB 0.1 один процесс
100 128 MB 0.2 один процесс
1k 256 MB 0.3 один процесс
10k 1 GB 0.5 master + replica
100k 4 GB 2 master + 2 replicas
1M 16 GB 4 Cluster (3 master + 3 replica), либо 2-3 разные инстансы (session/cache/queue)

---

Сайзинг Kafka

Производство для casino:

  • 1 спин = 2-3 события (bet placed, balance changed, stats event)
  • 1 депозит = 5-7 событий (incl. risk, bonus check, audit)
  • avg event size = 1.5 KB
Kafka_throughput_msg_s = RPS_peak × events_per_request (avg 2.5)
Kafka_storage_GB_day = msg_per_sec × avg_event_KB × 86400 × replication / 1024 / 1024
DAU msg/s peak Disk/день (RF=3, retention=7d) RAM CPU
1k 80 ~50 MB 1 GB 0.5
10k 800 ~500 MB 2 GB 1
100k 8k ~5 GB 8 GB 4
1M 80k ~50 GB 32 GB 16

---

Дисковая подсистема

DAU IOPS sustained IOPS peak Throughput Тип
≤ 1k 100 500 50 MB/s SATA SSD
≤ 10k 1k 5k 250 MB/s NVMe
≤ 100k 5k 20k 1 GB/s NVMe RAID10
≤ 1M 20k 100k 4 GB/s NVMe Cluster + EBS gp3/io2

---

Сетевые требования

egress_Mbps = RPS_peak × avg_response_KB × 8 / 1024

При avg_response = 5 KB:

DAU RPS peak Egress
1k 32 1.3 Mbps
10k 320 13 Mbps
100k 3 200 130 Mbps
1M 32 000 1.3 Gbps

---

Шкала тиров (для целевого SLA)

Тир DAU Архитектура
T0 — dev/demo ≤ 10 Single VM: всё в одном compose, без репликации
T1 — small client ≤ 1k Single VM, но Postgres+Redis на отдельных процессах. Daily backup
T2 — medium client ≤ 10k 2-3 VM: app, db, cache. Replica для PG. Backup hourly
T3 — large client ≤ 100k 5-10 VM: app cluster, PG primary+2 replicas, Redis HA, Kafka cluster
T4 — enterprise ≤ 1M Kubernetes / autoscaling. Sharded DB. Multi-region. PgBouncer. CDN

---

Допущения и ограничения

  1. CGO_ENABLED=1 в большинстве сервисов — overhead ~5-10% RAM против чистого Go
  2. JSONB-поля в PostgreSQL увеличивают I/O — учтено в "Heavy" категории
  3. Без шардинга PG до 100k DAU; для 1M — обязательно шардирование transactions, bets
  4. Replication factor: для T3+ Postgres = streaming replication; для T4 — synchronous replication между регионами
  5. Cold start: после рестарта сервис прогревается 30-60 сек, в это время CPU x2 от sustained
  6. GC pressure в Go: при больших аллокациях RAM = live_set × 2 для нормальной работы GOGC=100

---

Источники чисел

  • Industry benchmarks: TechEmpower (Gin), pgbench, redis-benchmark
  • Casino-specific: GLI/iGaming reports о среднем поведении игрока
  • Internal: anonymized наблюдения за реальной нагрузкой Bethub

Распределение RPS по сервисам

Используется для перевода общего DAU → RPS на каждый сервис.

Веса по сервисам

Сервис RPS share Per-action Notes
auth 5% 0.5/min/CCU login + refresh + token validate (cached)
core 25% 2.5/min/CCU CMS, chat, banners, news, FAQ — открытие любой страницы
game-processing 20% 2/min/CCU spin, game launch, session state
wallet 15% 1.5/min/CCU balance check на каждом spin + tx
bonuses 10% 1/min/CCU wagering progress, eligibility
stats 5% 0.5/min/CCU event ingestion (mostly async via Kafka)
sportsbook 4% 0.4/min/CCU active только если включён sportsbook
jackpot 3% 0.3/min/CCU display refresh + contribute event
segmentation 2% 0.2/min/CCU bonus eligibility lookup
store 2% 0.2/min/CCU catalog browse, occasional buy
tournament 2% 0.2/min/CCU leaderboard view, join
achievement 2% 0.2/min/CCU progress view
risk-management 2% 0.2/min/CCU sync risk check на deposit/withdraw
referral 1% 0.1/min/CCU invite tracking
payment 1% 0.1/min/CCU deposits/withdrawals — редко относительно spins
partner 0.5% 0.05/min/CCU affiliate tracking — фоновый
config 0.3% configs cached aggressively
balancer 0.1% event-driven
notifications 0.1% event-driven (consumer)
bi 0% offline reports + Kafka consumer not in user RPS
back-office 0% admin only (~50 admins regardless of DAU) not in user RPS
boilerplate n/a template, not deployed
Итого ~98% residual 2% — health checks, monitoring
Сумма не строго 100% — это эвристика. Используй с допуском ±20%.

Формула RPS на сервис

RPS_avg(service) = DAU × CCU_ratio × actions_per_min(service) / 60
RPS_peak(service) = RPS_avg × 3.0

Где:

  • CCU_ratio = 0.08 (8% DAU онлайн в любой момент)
  • actions_per_min(service) — из таблицы выше

Готовые цифры RPS_peak по сервисам

Сервис 100 DAU 1k DAU 10k DAU 100k DAU 1M DAU
auth 0.16 1.6 16 160 1 600
core 0.8 8 80 800 8 000
game-processing 0.64 6.4 64 640 6 400
wallet 0.48 4.8 48 480 4 800
bonuses 0.32 3.2 32 320 3 200
stats 0.16 1.6 16 160 1 600
sportsbook 0.13 1.3 13 130 1 280
jackpot 0.10 1.0 10 100 960
risk-management 0.06 0.6 6 64 640
segmentation 0.06 0.6 6 64 640
store 0.06 0.6 6 64 640
tournament 0.06 0.6 6 64 640
achievement 0.06 0.6 6 64 640
referral 0.03 0.3 3 32 320
payment 0.03 0.3 3 32 320
partner 0.02 0.16 1.6 16 160
config 0.01 0.1 1 9.6 96
balancer 0.003 0.03 0.3 3.2 32
notifications 0.003 0.03 0.3 3.2 32
bi 0 0 0 0 0
back-office 0.5 0.5 1 2 5
⚠️ peak coefficient 3× уже учтён.

Карта зависимостей сервисов

Получена из grep -r "SMC_*_SERVICE_URL" по всем репозиториям. Это synchronous HTTP вызовы между сервисами; асинхронные через Kafka — отдельно ниже.

Кто кого вызывает (sync HTTP)

Сервис Вызывает
achievement auth, backoffice, bonus, config, game, notification, segmentation, wallet
auth partner
back-office config
balancer backoffice
bi achievement, auth, backoffice, bonus, config, partner, payments, risk-management, sportsbook, store, wallet
bonuses achievement, auth, backoffice, config, game, notification, referral, segmentation, sportsbook, stats, wallet
core auth, backoffice, bonus, segmentation, stats
game-processing achievement, admin-auth, auth, bonus, config, core, jackpot, notification, partner, payments, segmentation, sportsbook, stats, tournament, wallet
jackpot auth, game, wallet
partner auth, backoffice, config, game, stats, wallet
payment achievement, auth, backoffice, balancer, config, core, notification, segmentation, stats, wallet
referral admin-auth, auth, config, stats, wallet
risk-management auth, backoffice, bonus, config, stats, wallet
segmentation auth, backoffice, stats, wallet
stats achievement, auth, bonus, config, notification, wallet
store bonus
tournament auth, backoffice, config, game, segmentation, wallet
wallet auth, backoffice, balancer, config
sportsbook (no SMC_* — только Digitain webhook)
notifications (нет данных — service пустой)
achievement (как выше)

Кто кого зовёт (inverted: «called by»)

Сервис Вызывается из
auth ALL (universally — token validation на каждом запросе)
wallet achievement, bi, bonuses, game-processing, jackpot, partner, payment, referral, risk-management, segmentation, stats, tournament
config achievement, back-office, bi, bonuses, game-processing, partner, payment, referral, risk-management, stats, tournament, wallet
stats bi, bonuses, core, game-processing, partner, payment, referral, risk-management, segmentation
back-office achievement, balancer, bi, bonuses, core, partner, payment, risk-management, segmentation, tournament, wallet
bonuses achievement, bi, core, game-processing, payment, risk-management, store, stats
notification achievement, bonuses, game-processing, payment, stats
segmentation achievement, bonuses, core, game-processing, payment, tournament
game achievement, bonuses, jackpot, partner, payment(via core), tournament
achievement bi, bonuses, game-processing, payment, stats
partner auth, bi, game-processing
sportsbook bi, bonuses, game-processing
core game-processing, payment
balancer payment, wallet
referral bonuses
store bi
jackpot game-processing
tournament game-processing
risk-management bi

Hot-path сервисы (вызываются на КАЖДОМ юзер-действии)

В порядке критичности latency:

  1. auth — токен валидируется на каждом запросе → агрессивный кеш (Redis + in-process) обязателен
  2. wallet — каждый spin = balance check + debit/credit → должен быть HA
  3. config — кешируется, но запрашивается чаще всех → кеш в каждом сервисе на 5+ минут
  4. bonuses — каждый bet проверяет wagering → кеш активных бонусов
  5. segmentation — bonus eligibility и AB-tests → memoize per-request

Hub сервисы (вызываются 10+ другими)

Сервис Зависимостей входящих Решение для роста
auth 22 Read replicas + Redis token cache
wallet 12 Read replica для balance reads, hot-path кеш на 30s
config 12 In-process cache на сервисах + pub/sub invalidation
stats 9 Pure write — async fire-and-forget где возможно
back-office 11 (но low RPS) Read-only access от других сервисов через materialized view
bonuses 8 Кеш активных бонусов в Redis, read replica

Критические circular зависимости

  • bonuses ↔ wallet: bonuses зовёт wallet (баланс), wallet зовёт bonuses (bonus balance)
  • Решение: сделать wallet "источник правды" по балансам, bonuses не зовёт wallet sync
  • core ↔ stats: core зовёт stats (chat events), stats зовёт core (?)
  • Проверить — в случае циркулярной зависимости вынести events в Kafka

Мёртвый код / стабы

  • notifications-service — пустой (0 LoC). Если нужны notifications — реализовать отдельно
  • boilerplate-service — template для новых сервисов, не разворачивается

Внешние зависимости (3rd-party)

Сервис 3rd-party
auth email/SMS providers, OAuth, 2FA
payment 15 PSPs (Stripe, crypto, etc.)
sportsbook Digitain (webhook only)
balancer Cloudflare, Namecheap, PSKZ, APISIX, PingAdmin
wallet TruePlay (provably fair)
game-processing game providers (likely 50+ vendors)
core S3/MinIO (file uploads)
notifications FCM, APNS, SendGrid (when implemented)

Граф зависимостей (Mermaid)

Sync HTTP-зависимости (упрощённая)

graph TD %% Hub services (called by many) AUTH[auth]:::hub WAL[wallet]:::hub CFG[config]:::hub STA[stats]:::hub BO[back-office]:::hub BNS[bonuses]:::hub NOT[notifications]:::hub SEG[segmentation]:::hub GAME[game-processing]:::hot %% Player-facing services CORE[core] PAY[payment]:::external SPB[sportsbook]:::external ACH[achievement] JKP[jackpot] TRN[tournament] STR[store] PAR[partner] REF[referral] BAL[balancer]:::external RIS[risk-management]:::critical BI[bi]:::analytics %% Player → hot path GAME --> AUTH GAME --> WAL GAME --> BNS GAME --> CFG GAME --> SEG GAME --> ACH GAME --> JKP GAME --> TRN GAME --> SPB GAME --> STA GAME --> PAR GAME --> NOT GAME --> CORE GAME --> PAY %% Wallet hub WAL --> AUTH WAL --> CFG WAL --> BO WAL --> BAL %% Bonuses hub BNS --> AUTH BNS --> WAL BNS --> ACH BNS --> CFG BNS --> NOT BNS --> REF BNS --> SEG BNS --> SPB BNS --> STA BNS --> BO %% Payment PAY --> AUTH PAY --> WAL PAY --> CFG PAY --> BAL PAY --> CORE PAY --> NOT PAY --> SEG PAY --> STA PAY --> ACH PAY --> BO %% Risk RIS --> AUTH RIS --> WAL RIS --> BNS RIS --> CFG RIS --> STA RIS --> BO %% Core CORE --> AUTH CORE --> BNS CORE --> SEG CORE --> STA CORE --> BO %% BI consumes from many (analytics) BI -.-> AUTH BI -.-> WAL BI -.-> BNS BI -.-> SPB BI -.-> ACH BI -.-> PAR BI -.-> RIS BI -.-> STR BI -.-> PAY %% Smaller services JKP --> AUTH JKP --> WAL TRN --> AUTH TRN --> WAL TRN --> SEG TRN --> CFG ACH --> AUTH ACH --> WAL ACH --> BNS ACH --> CFG ACH --> NOT ACH --> SEG PAR --> AUTH PAR --> WAL PAR --> CFG PAR --> STA PAR --> BO REF --> AUTH REF --> WAL REF --> CFG REF --> STA SEG --> AUTH SEG --> WAL SEG --> STA SEG --> BO STR --> BNS STA --> AUTH STA --> WAL STA --> BNS STA --> NOT STA --> CFG STA --> ACH BAL --> BO classDef hub fill:#fff3cd,stroke:#856404,stroke-width:2px classDef hot fill:#f8d7da,stroke:#721c24,stroke-width:2px classDef critical fill:#d1ecf1,stroke:#0c5460,stroke-width:2px classDef analytics fill:#d4edda,stroke:#155724,stroke-width:2px,stroke-dasharray: 5 5 classDef external fill:#e2e3e5,stroke:#383d41,stroke-width:2px

Легенда

  • 🟡 Hub (auth, wallet, config, stats, back-office, bonuses, notifications, segmentation) — вызываются многими; нужны read replicas / агрессивный кеш
  • 🔴 Hot path (game-processing) — входная точка spin'а, fan-out на 15 сервисов
  • 🟦 Critical (risk-management) — sync-блокирует payment/withdraw, latency-sensitive
  • 🟢 Analytics (bi, dashed lines) — consumer-side через Kafka, sync-вызовы редкие
  • External (sportsbook=Digitain, payment=PSPs, balancer=Cloudflare) — есть 3rd-party

---

Kafka-связи (упрощённо)

graph LR GAME[game-processing] -- game-action.created --> BNS GAME -- game-action.created --> ACH GAME -- game-action.created --> STA GAME -- game-action.created --> JKP GAME -- game-action.created --> TRN GAME -- game-action.created --> BI GAME -- game-action.created --> WAL PAY -- payment.completed --> BNS PAY -- payment.completed --> RIS PAY -- payment.completed --> STA PAY -- payment.completed --> REF PAY -- payment.completed --> BI AUTH -- user.registered --> SEG AUTH -- user.registered --> REF AUTH -- user.registered --> PAR AUTH -- user.registered --> BI WAL -- balance.changed --> BNS WAL -- transaction.created --> BI WAL -- transaction.created --> STA SPB -- bet.placed --> BNS SPB -- bet.settled --> WAL SPB -- bet.settled --> STA BAL -- domain.changed --> notifications classDef producer fill:#ffe4b5 classDef consumer fill:#c8e6c9 GAME:::producer PAY:::producer AUTH:::producer WAL:::producer SPB:::producer

Hot Path: один спин — какие сервисы трогаются?

sequenceDiagram participant U as User participant G as game-processing participant A as auth participant W as wallet participant B as bonuses participant J as jackpot participant ACH as achievement participant K as Kafka U->>G: POST /spin G->>A: validate token (cached, 5ms) G->>W: debit (sync, 20ms) W->>W: SELECT FOR UPDATE → INSERT tx W->>K: balance.changed G->>B: check wagering (cached, 10ms) G->>G: вызов провайдера игры (~50-200ms) G->>W: credit (sync, 20ms) W->>K: balance.changed G->>K: game-action.created K-->>B: wagering progress K-->>ACH: achievement progress K-->>J: jackpot contribution K-->>STA: stats event G-->>U: spin result (~100-300ms)

Затраты времени по компонентам spin'а (~150ms типовой)

Стадия Latency P50 P99 Sync?
auth validate (cache hit) 1-3ms 10ms sync
auth validate (cache miss) 10-30ms 100ms sync
wallet debit 15-30ms 80ms sync
bonuses check 5-15ms 50ms sync
game provider 50-200ms 1000ms sync (внешний)
wallet credit 15-30ms 80ms sync
Kafka publish (≈4 events) 1-3ms 10ms async
Sum (P50) ~120ms ~900ms
При cache miss на auth + slow wallet → могут быть >500ms даже при быстром провайдере. Cache hit на auth обязателен.

Тиры архитектуры

Шкала привязки DAU к архитектурному паттерну.

ТирDAU maxPatternPGRedisKafkaPgBouncerNotes
T010Single VM, all-in-compose1 instance1 instance1 brokernoDemo / dev
T11kSingle VM, separate processes1 primary, daily backup1 instance1 brokeroptionalSmall client
T210k3-5 VM, replicasprimary + replicamaster + replica3 brokersyesPgBouncer mandatory >200 conns
T3100kK8s или 10-20 VMprimary + 2 replicas, partitioningcluster (3+3)5+ brokers, partition≥32yesClickHouse for BI/stats
T41MMulti-region K8s, shardingSharded by user_idMulti-clusterDedicated analytics clusteryes (1 per app pool)CDN, autoscaling

Все сервисы (22)

casino-core-service

medium Доля общего RPS: 25%

Минимум RAM
384 MB
для запуска (0 юзеров)
Минимум CPU
0.6
cores idle
Действий/DAU/день
60
ходит в этот сервис
Записи/DAU/год
1.8 MB
~5 KB/день

Что растёт линейно с DAU

  • Chat messages — самая растущая таблица, ~3 сообщений/CCU/мин
  • Story views — каждый show = upsert (с unique constraint)
  • App RAM — 1-2 MB на 10 RPS

Что растёт ступенями (нелинейно)

  • При 10k+ CCU — chat partitioning по datetime
  • Story view upsert contention — на популярные stories спайки

Узкое место

Что сломается первым: chat_messages таблица растёт неконтролируемо

Когда: ~50,000 DAU

Как обойти: Партиционировать chat_messages по дате; old chats → cold storage; rate-limit на chat send

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.51 GB64 MB0.4 GB0.6
100143 MB0.2512 MB0.72 GB128 MB0.8 GB0.9
1k204 MB0.31.0 GB1.05 GB256 MB1.5 GB1.3
10k716 MB1.52.0 GB2.030 GB512 MB3.2 GB3.5
100k4.0 GB4.08.0 GB4.0300 GB4096 MB20.0 GB12.0
1M16.0 GB16.032.0 GB16.02.9 TB16384 MB128.0 GB80.0

Запросы к БД и Redis

Профиль: 2.5 q/HTTP-request (read: 2.4, write: 0.1), Redis: 0.5 ops/req, cache hit: 80%, avg query latency: 10 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.10.00.00.010
1000.80.40.10.410
1k8.03.80.84.010
10k80.038.48.040.010
100k800.0384.080.3400.010
1M8000.03840.0803.54000.070 ⚠ PgBouncer
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • CMS + chat — открытие любой страницы. Hub для контента.
  • Admin chat ban list часто опрашивается — кеш в Redis обязателен.
  • Story view кафка-продьюсер: при 1M DAU peak ~2k events/sec на топик.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-game-processing-service

heavy Доля общего RPS: 20%

Минимум RAM
384 MB
для запуска (0 юзеров)
Минимум CPU
0.7
cores idle
Действий/DAU/день
200
ходит в этот сервис
Записи/DAU/год
35.6 MB
~100 KB/день

Что растёт линейно с DAU

  • game_actions — 1 row/spin = 200 rows/DAU/day
  • RAM app — 2-3 MB на 10 RPS (orchestrator, держит state)
  • Outbound HTTP коннекты в wallet/bonuses/etc

Что растёт ступенями (нелинейно)

  • Provider HTTP latency — скачок при их API throttling
  • Game catalog cache invalidation — каждые 2 часа полный rebuild
  • При 100k+ DAU — game_actions партиционирование по date обязательно

Узкое место

Что сломается первым: Sync HTTP вызов wallet — wallet p99 latency напрямую = spin latency

Когда: ~10,000 DAU

Как обойти: Circuit breaker на wallet calls; bulk Kafka events; партицирование game_actions; реплики app

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
10102 MB0.2262 MB0.51 GB64 MB0.5 GB0.7
100184 MB0.3512 MB0.73 GB128 MB0.9 GB1.0
1k256 MB0.51.0 GB1.08 GB256 MB1.5 GB1.5
10k1.0 GB2.04.0 GB4.060 GB1024 MB6.0 GB6.0
100k12.0 GB9.016.0 GB8.0600 GB4096 MB32.0 GB18.0
1M96.0 GB36.0128.0 GB32.05.9 TB16384 MB224.0 GB150.0

Запросы к БД и Redis

Профиль: 6.0 q/HTTP-request (read: 4.0, write: 2.0), Redis: 1.0 ops/req, cache hit: 60%, avg query latency: 15 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.10.10.10.110
1000.61.01.30.610
1k6.410.212.86.410
10k64.0102.4128.264.010
100k640.01024.01281.7640.052 ⚠ PgBouncer
1M6400.010240.012817.46400.0519 ⚠ PgBouncer
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Spin orchestrator — fan-out на 15 сервисов. Самый горячий путь.
  • game_actions table растёт неограниченно (1 строка на spin) — нужно партиционирование @ >10k DAU.
  • Sync HTTP вызов wallet — wallet p99 latency напрямую влияет на spin SLA.
  • Provider callbacks (Softswiss/Slotegrator/Zenith/Hub88) — внешний latency может всплывать.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-wallet-service

heavy (financial-critical) Доля общего RPS: 15%

Минимум RAM
768 MB
для запуска (0 юзеров)
Минимум CPU
0.8
cores idle
Действий/DAU/день
400
ходит в этот сервис
Записи/DAU/год
106.9 MB
~300 KB/день

Что растёт линейно с DAU

  • transactions — 400 rows/DAU/day; самая большая таблица
  • DB write QPS = 3 × RPS — каждая транзакция = 3 INSERT/UPDATE
  • Redis balance cache — 0.5 KB на CCU юзер, TTL 30s

Что растёт ступенями (нелинейно)

  • SELECT FOR UPDATE row lock — на горячих юзерах queue растёт нелинейно
  • WAL throughput — при 1k+ wQPS нужен NVMe + отдельный диск под WAL
  • При 100k DAU — read replica для отчётов (выгрузки)
  • При 1M DAU — шардинг по user_id (минимум 4 шарда)

Узкое место

Что сломается первым: Lock contention на balance row у активных юзеров (whale users)

Когда: ~50,000 DAU

Как обойти: Балансы в Redis с периодической сверкой; шардинг transactions по user_id; партицирование по дате; pgBouncer transaction mode

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
10102 MB0.2524 MB0.51 GB64 MB0.7 GB0.7
100204 MB0.31.0 GB0.73 GB128 MB1.4 GB1.0
1k307 MB0.52.0 GB1.010 GB256 MB2.5 GB1.5
10k1.0 GB2.08.0 GB4.0100 GB1024 MB10.0 GB6.0
100k12.0 GB9.064.0 GB16.01000 GB8192 MB96.0 GB40.0
1M96.0 GB36.0256.0 GB64.09.8 TB32768 MB440.0 GB220.0

Запросы к БД и Redis

Профиль: 5.0 q/HTTP-request (read: 2.0, write: 3.0), Redis: 1.0 ops/req, cache hit: 70%, avg query latency: 15 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.10.010
1000.50.31.40.510
1k4.82.914.44.810
10k48.028.8144.148.010
100k480.0288.01441.0480.039 ⚠ PgBouncer
1M4800.02880.014410.44800.0389 ⚠ PgBouncer
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • ACID критично: SELECT FOR UPDATE на каждой транзакции.
  • transactions table — самая большая таблица. Партиционирование по user_id обязательно @ >100k DAU.
  • При 1M DAU — шардинг по user_id (2-4 шарда минимум).
  • Read replica для отчётов back-office чтобы не блокировать primary.
  • TruePlay sync HTTP — может стопорить game-action consumer; добавить timeout + DLQ.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-auth-service

heavy (universal hot path) Доля общего RPS: 5%

Минимум RAM
320 MB
для запуска (0 юзеров)
Минимум CPU
0.7
cores idle
Действий/DAU/день
150
ходит в этот сервис
Записи/DAU/год
0.7 MB
~2 KB/день

Что растёт линейно с DAU

  • RAM app — растёт ~+0.5 MB на каждые 10 RPS (concurrent goroutines)
  • PG sessions table — линейно по DAU (~5 KB/юзер при средней сессии)
  • Redis token cache — линейно по CCU (~2 KB/юзер)

Что растёт ступенями (нелинейно)

  • DB CPU — скачком при потере кеш-хита (например, 95% → 90%)
  • При 100k+ DAU — нужен read replica для админских запросов
  • При 1M DAU — переход sessions из PG в Redis даёт -70% DB load

Узкое место

Что сломается первым: Token validation latency — если cache miss > 5%, PG не справляется

Когда: ~30,000 DAU

Как обойти: Redis-only sessions + JWT stateless (denylist в Redis)

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.50 GB64 MB0.4 GB0.6
100133 MB0.2512 MB0.71 GB128 MB0.8 GB0.9
1k204 MB0.31.0 GB1.02 GB256 MB1.5 GB1.3
10k614 MB1.02.0 GB2.020 GB1024 MB3.6 GB3.0
100k4.0 GB4.08.0 GB4.0200 GB4096 MB18.0 GB12.0
1M32.0 GB16.032.0 GB16.02.0 TB16384 MB96.0 GB64.0

Запросы к БД и Redis

Профиль: 1.5 q/HTTP-request (read: 1.5, write: 0.0), Redis: 1.0 ops/req, cache hit: 95%, avg query latency: 15 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.20.00.00.210
1k1.60.10.01.610
10k16.01.20.116.010
100k160.012.00.7160.010
1M1600.0120.06.91600.010
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Token validation на каждом запросе всех сервисов — кеш Redis ОБЯЗАТЕЛЕН.
  • Сейчас sessions хранятся в Postgres — миграция в Redis снимает 70% нагрузки на DB.
  • SMS/email/SumSub/Fingerprint.js — переменные затраты per-user. Бюджетировать отдельно.
  • При 1M DAU рассмотреть JWT stateless с denylist в Redis вместо DB sessions.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-bonuses-service

heavy (every bet) Доля общего RPS: 10%

Минимум RAM
512 MB
для запуска (0 юзеров)
Минимум CPU
0.7
cores idle
Действий/DAU/день
250
ходит в этот сервис
Записи/DAU/год
53.5 MB
~150 KB/день

Что растёт линейно с DAU

  • wagering_log — 1 row на bet (через Kafka consumer)
  • user_bonuses growth = sum активных бонусов × кол-во юзеров
  • Redis active_bonus cache — 1 KB/CCU

Что растёт ступенями (нелинейно)

  • Скачок при крупных промо-кампаниях (free spins для всех = единоразовый INSERT batch)
  • Asynq queue (5 cron) — фиксированные пики времени
  • При 100k DAU — отдельный consumer для game-action.created

Узкое место

Что сломается первым: Kafka consumer lag на game-action.created — wagering progress отстаёт

Когда: ~30,000 DAU

Как обойти: Increase consumer parallelism; batch updates; кеш активных бонусов в Redis HASH; партицирование wagering_log

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
10102 MB0.2524 MB0.51 GB128 MB0.7 GB0.7
100204 MB0.31.0 GB1.03 GB256 MB1.5 GB1.3
1k307 MB0.52.0 GB2.010 GB512 MB3.0 GB2.5
10k1.5 GB2.08.0 GB4.0100 GB2048 MB12.0 GB6.0
100k12.0 GB8.032.0 GB8.01000 GB8192 MB52.0 GB24.0
1M64.0 GB32.0128.0 GB32.09.8 TB32768 MB224.0 GB130.0

Запросы к БД и Redis

Профиль: 4.0 q/HTTP-request (read: 3.0, write: 1.0), Redis: 2.0 ops/req, cache hit: 70%, avg query latency: 15 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.110
1000.30.30.30.610
1k3.22.93.26.410
10k32.028.832.364.010
100k320.0288.0323.5640.014
1M3200.02880.03234.76400.0138 ⚠ PgBouncer
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Wagering progress — каждый bet триггерит update. Самый высокий write rate из всех сервисов.
  • Active bonuses cache в Redis обязателен — иначе DB не справится.
  • Asynq queue (5 scheduled jobs) — отдельный worker.
  • Кафка consumer game-action.created — рассмотреть batch processing для @ >100k DAU.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-payment-service

heavy (PSP orchestrator) Доля общего RPS: 1%

Минимум RAM
384 MB
для запуска (0 юзеров)
Минимум CPU
0.7
cores idle
Действий/DAU/день
0.5
ходит в этот сервис
Записи/DAU/год
1.8 MB
~5 KB/день

Что растёт линейно с DAU

  • payment_orders — линейный, 0.2 row/DAU/day (deposits)
  • PSP webhook traffic — независимый от DAU (зависит от транзакций)

Что растёт ступенями (нелинейно)

  • PSP webhook bursts — могут давать пик x10 от среднего
  • При смене PSP — изоляция новой интеграции
  • Crypto deposits подтверждения — другой паттерн (long polling)

Узкое место

Что сломается первым: Idempotency на webhook'ах — без партиционирования payment_orders медленнее с ростом

Когда: ~100,000 DAU

Как обойти: Партицирование payment_orders по месяцу; архив PG → S3 после 1 года; rate-limit на PSP webhooks

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.50 GB64 MB0.4 GB0.7
100133 MB0.2512 MB0.72 GB128 MB0.8 GB1.0
1k204 MB0.31.0 GB1.05 GB256 MB1.5 GB1.5
10k512 MB0.72.0 GB2.050 GB512 MB3.0 GB2.7
100k4.0 GB3.08.0 GB4.0500 GB2048 MB16.0 GB9.0
1M12.0 GB12.032.0 GB16.04.9 TB8192 MB80.0 GB45.0

Запросы к БД и Redis

Профиль: 4.0 q/HTTP-request (read: 2.0, write: 2.0), Redis: 0.5 ops/req, cache hit: 30%, avg query latency: 15 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.00.00.10.010
1k0.30.40.70.210
10k3.24.56.51.610
100k32.044.865.016.010
1M320.0448.0650.4160.025
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • 15 PSP интеграций — каждая со своими webhook'ами и rate limit'ами.
  • Idempotency через payment_orders — таблица не партиционирована, нужно архивировать.
  • Webhook bursts от PSP могут давать пик x10 от среднего — плотный rate limit.
  • in-process cache (10min TTL) — cold restart даёт спайк к зависимостям.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-bi-service

heavy (analytics) Доля общего RPS: 0%

Минимум RAM
1024 MB
для запуска (0 юзеров)
Минимум CPU
1.5
cores idle
Действий/DAU/день
0
ходит в этот сервис
Записи/DAU/год
178.2 MB
~500 KB/день

Что растёт линейно с DAU

  • events table растёт пропорционально всей платформы (Kafka из всех сервисов)
  • PG disk — единственный сильно растущий компонент (без партицирования = катастрофа)

Что растёт ступенями (нелинейно)

  • Aggregation queries — резкий скачок latency после 100M строк в events
  • При >10k DAU — миграция на ClickHouse даёт сжатие 10× и скорость 100×

Узкое место

Что сломается первым: Aggregation queries блокируют write transactions

Когда: ~10,000 DAU

Как обойти: ClickHouse для events; PG только для metadata; materialized views для частых отчётов

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
10102 MB0.11.0 GB1.05 GB64 MB1.2 GB1.2
100184 MB0.22.0 GB1.515 GB96 MB2.4 GB1.8
1k256 MB0.34.0 GB2.050 GB128 MB4.5 GB2.5
10k1.0 GB1.016.0 GB4.0500 GB256 MB18.0 GB6.0
100k2.0 GB2.064.0 GB16.04.9 TB1024 MB70.0 GB20.0
1M4.0 GB4.064.0 GB32.048.8 TB4096 MB120.0 GB40.0

Запросы к БД и Redis

Профиль: 0.5 q/HTTP-request (read: 0.5, write: 0.0), Redis: 0.1 ops/req, cache hit: 20%, avg query latency: 200 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.00.00.00.010
1k0.00.00.10.010
10k0.00.01.00.010
100k0.00.010.40.010
1M0.00.0104.20.031 ⚠ PgBouncer
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • **МИГРИРОВАТЬ НА CLICKHOUSE @ >10k DAU.** Postgres не справится с aggregations.
  • Pure Kafka consumer — 46 топиков из всей платформы.
  • Нет materialized views — все отчёты считают на лету.
  • Disk @ 1M DAU = 50 TB / год; ClickHouse сжимает в 10x.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-stats-service

medium-heavy (write-heavy) Доля общего RPS: 5%

Минимум RAM
384 MB
для запуска (0 юзеров)
Минимум CPU
0.7
cores idle
Действий/DAU/день
50
ходит в этот сервис
Записи/DAU/год
71.3 MB
~200 KB/день

Что растёт линейно с DAU

  • transactions table — 1 row на event из Kafka
  • Aggregation jobs — фиксированная нагрузка независимо от DAU

Что растёт ступенями (нелинейно)

  • При >100k DAU — аналогично BI, ClickHouse
  • Anti-fraud turnover queries замедляются при больших суммарных таблицах

Узкое место

Что сломается первым: Aggregation на events table при write нагрузке

Когда: ~50,000 DAU

Как обойти: Партицирование events по date; read replica для aggregation; хот-кеш топ-метрик в Redis

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.51 GB64 MB0.4 GB0.6
100133 MB0.2512 MB0.73 GB128 MB0.8 GB0.9
1k204 MB0.32.0 GB1.020 GB256 MB2.5 GB1.5
10k614 MB1.08.0 GB4.0200 GB512 MB9.0 GB5.0
100k4.0 GB4.032.0 GB8.02.0 TB2048 MB40.0 GB15.0
1M24.0 GB12.032.0 GB16.019.5 TB8192 MB80.0 GB35.0

Запросы к БД и Redis

Профиль: 1.2 q/HTTP-request (read: 0.0, write: 1.2), Redis: 0.0 ops/req, cache hit: 0%, avg query latency: 10 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.20.00.20.010
1k1.60.02.00.010
10k16.00.019.90.010
100k160.00.0198.90.010
1M1600.00.01989.40.030
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • transactions table append-only без партиций — критическая проблема >100k DAU.
  • Кандидат на ClickHouse @ >100k DAU.
  • Aggregation jobs (NGR, GGR) — тяжёлые, на read replica если возможно.
  • Anti-fraud turnover checks — sync hot path на withdrawals.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-achievement-service

medium-heavy (kafka fan-in) Доля общего RPS: 2%

Минимум RAM
384 MB
для запуска (0 юзеров)
Минимум CPU
0.6
cores idle
Действий/DAU/день
250
ходит в этот сервис
Записи/DAU/год
71.3 MB
~200 KB/день

Что растёт линейно с DAU

  • user_achievements — рост ~ N achievements × N users
  • Kafka throughput — 21 топика consumed
  • user_points — append на каждый event

Что растёт ступенями (нелинейно)

  • Leaderboards refresh — фиксированный фоновый CPU
  • При >100k DAU — партицирование user_achievements обязательно
  • In-process LRU dedup — НЕ shared между replicas → дубли при scale-out

Узкое место

Что сломается первым: Kafka consumer lag (game-action.created в 2 группах)

Когда: ~30,000 DAU

Как обойти: Внешний dedup через Redis SET; партицирование user_achievements; consumer parallelism +

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.51 GB64 MB0.4 GB0.6
100133 MB0.2512 MB0.73 GB128 MB0.8 GB0.9
1k204 MB0.31.0 GB1.010 GB256 MB1.5 GB1.3
10k614 MB1.04.0 GB2.0100 GB512 MB5.0 GB3.0
100k4.0 GB3.016.0 GB4.01000 GB2048 MB22.0 GB9.0
1M24.0 GB9.064.0 GB16.04.9 TB8192 MB96.0 GB35.0

Запросы к БД и Redis

Профиль: 3.0 q/HTTP-request (read: 1.0, write: 2.0), Redis: 0.5 ops/req, cache hit: 40%, avg query latency: 10 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.10.00.10.010
1k0.60.41.30.310
10k6.43.813.33.210
100k64.038.4133.232.010
1M640.0384.01332.1320.026
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • 21 Kafka topics consumed — самый широкий fan-in в платформе.
  • user_achievements/user_points high-churn tables — партиционирование обязательно.
  • In-process LRU dedup — НЕ shared между replicas, риск дублей.
  • 2 consumer groups на game-action.created — мониторить лаги отдельно.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-back-office-service

medium (admin only) Доля общего RPS: 0% (admin RPS)

Минимум RAM
384 MB
для запуска (0 юзеров)
Минимум CPU
0.6
cores idle
Действий/DAU/день
0
ходит в этот сервис
Записи/DAU/год
0.2 MB
~0.5 KB/день

Что растёт линейно с DAU

  • go_admin_logs — растёт по числу админов и активности
  • Дашборды грузят данные из других сервисов

Что растёт ступенями (нелинейно)

  • Большие отчёты — burst CPU (можно использовать read replica)
  • Audit log retention — нужна архивация после 1 года

Узкое место

Что сломается первым: go_admin_logs растёт неограниченно

Когда: ~1,000,000 DAU

Как обойти: Архивация audit_log в S3 после 1 года; reports через read replica; sticky sessions

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.51 GB64 MB0.4 GB0.6
100153 MB0.3512 MB0.73 GB96 MB0.8 GB1.0
1k256 MB0.51.0 GB1.010 GB128 MB1.4 GB1.5
10k256 MB0.51.0 GB1.050 GB128 MB1.4 GB1.5
100k307 MB0.71.5 GB1.0100 GB128 MB1.9 GB1.7
1M524 MB1.04.0 GB2.0200 GB256 MB5.0 GB3.0

Запросы к БД и Redis

Профиль: 4.0 q/HTTP-request (read: 4.0, write: 0.0), Redis: 1.0 ops/req, cache hit: 90%, avg query latency: 10 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.00.00.00.010
1k0.00.00.00.010
10k0.00.00.00.010
100k0.00.00.00.010
1M0.00.00.00.010
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • RPS зависит от количества админов (~50-200), а не от DAU юзеров.
  • go_admin_logs (audit) — единственная растущая таблица. Retention 1-2 года.
  • user_sessions в Redis без TTL — рестарт Redis = логаут всех админов. Использовать persistent.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-config-service

light (read-cached) Доля общего RPS: 0.3%

Минимум RAM
192 MB
для запуска (0 юзеров)
Минимум CPU
0.5
cores idle
Действий/DAU/день
0.5
ходит в этот сервис
Записи/DAU/год
0.0 MB
~0 KB/день

Что растёт линейно с DAU

  • Почти ничего — конфиги фиксированные
  • Read traffic растёт пропорционально кол-ву app-инстансов (а не DAU)

Что растёт ступенями (нелинейно)

  • При >100 app-инстансов — кеш в каждом помогает
  • Bulk update — N+1 запросов

Узкое место

Что сломается первым: Cache invalidation race на bulk updates

Когда: ~1,000,000 DAU

Как обойти: Локальный кеш в каждом сервисе с TTL 5 мин; pub/sub invalidation

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1051 MB0.05262 MB0.50 GB32 MB0.3 GB0.6
10081 MB0.07262 MB0.50 GB48 MB0.4 GB0.6
1k102 MB0.1262 MB0.50 GB64 MB0.5 GB0.6
10k204 MB0.2524 MB0.51 GB128 MB0.9 GB0.7
100k409 MB0.51.0 GB1.05 GB256 MB1.7 GB1.5
1M2.0 GB2.02.0 GB1.010 GB1024 MB5.0 GB3.0

Запросы к БД и Redis

Профиль: 0.05 q/HTTP-request (read: 0.05, write: 0.0), Redis: 1.0 ops/req, cache hit: 99%, avg query latency: 5 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.00.00.00.010
1k0.10.00.00.110
10k1.00.00.01.010
100k9.60.00.09.610
1M96.00.00.096.010
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Hit rate в Redis cache > 99% — Postgres почти простаивает.
  • Кафки нет (env vars присутствуют, но не используются).
  • BulkUpdate — N+1 pattern, при тысячах ключей будет медленно.
  • Cache invalidation не атомарна с DB write — race в крайних случаях.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-jackpot-service

medium (atomic counters) Доля общего RPS: 3%

Минимум RAM
256 MB
для запуска (0 юзеров)
Минимум CPU
0.6
cores idle
Действий/DAU/день
200
ходит в этот сервис
Записи/DAU/год
28.5 MB
~80 KB/день

Что растёт линейно с DAU

  • game_action_for_jackpots — 1 row/bet
  • INCR на jackpots.current_winning_amount — горячий row

Что растёт ступенями (нелинейно)

  • Win event — единоразовый burst (notification + payout)
  • Cron 10-min winner selection — фиксированный пик

Узкое место

Что сломается первым: Hot row write на jackpots row под высокой bet rate

Когда: ~30,000 DAU

Как обойти: Перенести counter в Redis INCRBYFLOAT; периодически (1-min) flush в DB; партицирование game_action_for_jackpots

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.50 GB64 MB0.4 GB0.6
100133 MB0.15409 MB0.51 GB96 MB0.6 GB0.7
1k153 MB0.2524 MB0.52 GB128 MB0.8 GB0.7
10k409 MB0.51.0 GB1.020 GB256 MB1.7 GB1.5
100k3.0 GB2.04.0 GB2.0200 GB1024 MB8.0 GB4.0
1M12.0 GB8.016.0 GB8.02.0 TB4096 MB40.0 GB20.0

Запросы к БД и Redis

Профиль: 2.0 q/HTTP-request (read: 1.0, write: 1.0), Redis: 1.0 ops/req, cache hit: 80%, avg query latency: 10 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.10.00.10.110
1k1.00.21.01.010
10k9.61.99.89.610
100k96.019.298.196.010
1M960.0192.0980.8960.018
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Hot row write на jackpots.current_winning_amount — переносить в Redis INCRBYFLOAT.
  • game_action_for_jackpots — без retention, расти будет миллиардами строк.
  • Cron 10-min winner selection — multi-step transaction + sync wallet payout.
  • При 1M DAU переход на Redis-only counters обязателен.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-tournament-service

medium (leaderboards) Доля общего RPS: 2%

Минимум RAM
256 MB
для запуска (0 юзеров)
Минимум CPU
0.6
cores idle
Действий/DAU/день
30
ходит в этот сервис
Записи/DAU/год
7.1 MB
~20 KB/день

Что растёт линейно с DAU

  • tournament_participants — растёт по числу активных турниров × DAU
  • leaderboard updates — 1 ZADD на bet в активном турнире

Что растёт ступенями (нелинейно)

  • End-of-tournament batch payout — фиксированный пик (sync wallet calls)
  • При >10k участников — leaderboard паджинация обязательна

Узкое место

Что сломается первым: Sync wallet calls в end-of-tournament payout

Когда: ~100,000 DAU

Как обойти: Async payout через Kafka + worker; Redis ZSET для leaderboard; chunk payout (200/sec)

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.50 GB64 MB0.4 GB0.6
100133 MB0.15409 MB0.51 GB128 MB0.7 GB0.7
1k153 MB0.2524 MB0.52 GB256 MB0.9 GB0.7
10k409 MB0.51.0 GB1.020 GB1024 MB2.5 GB1.5
100k3.0 GB2.04.0 GB2.0200 GB4096 MB14.0 GB5.0
1M12.0 GB8.016.0 GB8.02.0 TB16384 MB64.0 GB24.0

Запросы к БД и Redis

Профиль: 2.5 q/HTTP-request (read: 1.5, write: 1.0), Redis: 2.0 ops/req, cache hit: 90%, avg query latency: 10 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.10.00.10.110
1k0.60.10.71.310
10k6.41.06.512.810
100k64.09.665.4128.010
1M640.096.0653.91280.011
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Redis sorted sets (ZSET) — обязательно для leaderboards.
  • End-of-tournament batch payout (sync wallet calls) — фиксированный пик.
  • Tie-break logic — внимательно с consistency между Redis cache и DB.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-segmentation-service

medium (recalc loop) Доля общего RPS: 2%

Минимум RAM
256 MB
для запуска (0 юзеров)
Минимум CPU
0.6
cores idle
Действий/DAU/день
5
ходит в этот сервис
Записи/DAU/год
0.4 MB
~1 KB/день

Что растёт линейно с DAU

  • segmentation_users — линейно по числу сегментов × юзеров
  • 5-секундный recalc loop — фоновый CPU постоянный

Что растёт ступенями (нелинейно)

  • Большие сегменты с правилами на stats — медленная переоценка
  • Каждый новый сегмент = +5%-10% постоянной нагрузки

Узкое место

Что сломается первым: 5-сек recalc loop под большим количеством сегментов

Когда: ~50,000 DAU

Как обойти: Дельта-recalc вместо full; кеш сегментов в Redis 30 sec; разделить cron heavy/light сегментов

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.50 GB64 MB0.4 GB0.6
100133 MB0.15409 MB0.50 GB96 MB0.6 GB0.7
1k153 MB0.2524 MB0.51 GB128 MB0.8 GB0.7
10k409 MB0.72.0 GB2.010 GB256 MB2.7 GB2.7
100k1.5 GB2.08.0 GB4.0100 GB1024 MB11.0 GB6.0
1M8.0 GB8.032.0 GB16.01000 GB4096 MB44.0 GB24.0

Запросы к БД и Redis

Профиль: 3.0 q/HTTP-request (read: 2.0, write: 1.0), Redis: 0.5 ops/req, cache hit: 70%, avg query latency: 5 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.10.00.10.010
1k0.60.40.70.310
10k6.43.86.93.210
100k64.038.469.232.010
1M640.0384.0692.1320.010
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • 5-секундный recalc loop — при больших сегментах фоновый CPU будет постоянно высоким.
  • Asynq concurrency 30 — настраивай отдельно от HTTP концурентности.
  • Membership чтения — без Redis cache, при росте DAU добавить кеш на 30-60 сек.
  • WebSocket индирект через notification-service.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-risk-management-service

medium (sync withdraw path) Доля общего RPS: 2%

Минимум RAM
384 MB
для запуска (0 юзеров)
Минимум CPU
0.7
cores idle
Действий/DAU/день
5
ходит в этот сервис
Записи/DAU/год
10.7 MB
~30 KB/день

Что растёт линейно с DAU

  • risk_events — 1 row на каждое значимое событие (deposit, withdraw)
  • alerts — линейно от триггеров правил
  • PEP cache в Redis — 24h TTL

Что растёт ступенями (нелинейно)

  • Регуляторное хранение 5-7 лет = unbounded growth без партицирования
  • Sync withdraw path — latency-critical
  • PEP/AML провайдер (Dilisense) rate limit — спайки на регистрациях

Узкое место

Что сломается первым: risk_events table grows; sync /scoring-system latency блокирует withdrawals

Когда: ~50,000 DAU

Как обойти: Партицирование events по месяцу + холодное в S3; bloom filter для blacklist; circuit breaker на PEP

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.50 GB64 MB0.4 GB0.6
100133 MB0.2512 MB0.72 GB128 MB0.8 GB0.9
1k204 MB0.31.0 GB1.05 GB256 MB1.5 GB1.3
10k614 MB1.04.0 GB2.050 GB512 MB5.0 GB3.0
100k4.0 GB3.016.0 GB4.0500 GB2048 MB22.0 GB9.0
1M24.0 GB9.064.0 GB16.04.9 TB8192 MB96.0 GB35.0

Запросы к БД и Redis

Профиль: 3.0 q/HTTP-request (read: 2.0, write: 1.0), Redis: 1.0 ops/req, cache hit: 80%, avg query latency: 10 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.10.00.10.110
1k0.60.30.70.610
10k6.42.66.76.410
100k64.025.667.564.010
1M640.0256.0674.7640.014
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • **Регуляторное хранение 5-7 лет** — партиционирование событий + холодное хранилище.
  • Sync hot path на /scoring-system + /risk-summary в payment withdraw flow — latency-critical.
  • PEP/AML провайдер (Dilisense) — sync HTTP, добавить circuit breaker.
  • Blacklist должен быть в Redis (или bloom filter) для быстрых lookup.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-sportsbook-service

medium (Digitain webhook) Доля общего RPS: 4%

Минимум RAM
256 MB
для запуска (0 юзеров)
Минимум CPU
0.6
cores idle
Действий/DAU/день
30
ходит в этот сервис
Записи/DAU/год
17.8 MB
~50 KB/день

Что растёт линейно с DAU

  • bet_operations — 1 row/bet через Digitain webhook
  • Sessions — 1 row на старт/конец сессии

Что растёт ступенями (нелинейно)

  • Burst при старте популярных матчей (live betting)
  • Settlement runs пакетные — стабильный пик
  • При 10k+ — нужен Redis для auth token cache (сейчас sync HTTP к auth)

Узкое место

Что сломается первым: Auth-сервис latency на каждом webhook — нет локального кеша

Когда: ~10,000 DAU

Как обойти: Добавить Redis для auth token cache; шардинг сессий; rate-limit на DebitByBatch

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.50 GB0.3 GB0.6
100133 MB0.2512 MB0.72 GB0.6 GB0.9
1k204 MB0.31.0 GB1.05 GB1.2 GB1.3
10k614 MB1.04.0 GB2.050 GB256 MB5.0 GB3.0
100k4.0 GB3.016.0 GB4.0500 GB1024 MB20.0 GB9.0
1M24.0 GB12.064.0 GB16.04.9 TB4096 MB88.0 GB45.0

Запросы к БД и Redis

Профиль: 5.0 q/HTTP-request (read: 3.0, write: 2.0), Redis: 0.2 ops/req, cache hit: 30%, avg query latency: 10 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.10.30.30.010
1k1.32.72.60.310
10k12.826.925.72.610
100k128.0268.8257.425.610
1M1280.02688.02573.9256.079 ⚠ PgBouncer
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Redis сейчас 0 — нужно добавить хотя бы для auth token cache (DOS защита).
  • Digitain webhook DebitByBatch/RollBackByBatch — внутри multi-step DB transaction + Kafka.
  • Burst при старте популярных матчей — горизонтальное масштабирование подов.
  • Settlement runs пакетные — мониторить хвост хвоста.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-balancer

light (geo-redirect) Доля общего RPS: 0.1%

Минимум RAM
256 MB
для запуска (0 юзеров)
Минимум CPU
0.4
cores idle
Действий/DAU/день
1
ходит в этот сервис
Записи/DAU/год
0.0 MB
~0 KB/день

Что растёт линейно с DAU

  • Memory — почти не растёт (GeoIP2 фиксированный, ~100 MB)
  • DB — domain registry, фиксированный размер

Что растёт ступенями (нелинейно)

  • Provisioning workflows — внешние API rate limits (Cloudflare/Namecheap)
  • Domain мониторинг — фиксированный фоновый трафик

Узкое место

Что сломается первым: Внешние API провайдеров (Cloudflare/Namecheap rate limits)

Когда: ~1,000,000 DAU

Как обойти: Горизонтальное масштабирование (stateless); кеш GeoIP lookup в Redis; queue провижионинга

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1081 MB0.1262 MB0.30 GB0.3 GB0.4
100122 MB0.15262 MB0.30 GB0.4 GB0.5
1k153 MB0.2262 MB0.30 GB0.4 GB0.5
10k307 MB0.5524 MB0.52 GB0.8 GB1.0
100k1.0 GB2.01.0 GB1.020 GB2.0 GB3.0
1M8.0 GB8.04.0 GB2.0200 GB12.0 GB10.0

Запросы к БД и Redis

Профиль: 1.0 q/HTTP-request (read: 1.0, write: 0.0), Redis: 0.0 ops/req, cache hit: 0%, avg query latency: 5 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.00.00.00.010
1k0.00.00.00.010
10k0.30.30.10.010
100k3.23.20.70.010
1M32.032.06.90.010
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Это NOT load balancer — это geo-routing service (mirror domains).
  • GeoIP2 in-memory — 100 MB на инстанс, легко горизонтально масштабируется.
  • Domain provisioning через Cloudflare/Namecheap/PSKZ — внешние API rate limits.
  • Не на критическом пути — failover на DNS-уровне.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-store-service

light Доля общего RPS: 2%

Минимум RAM
256 MB
для запуска (0 юзеров)
Минимум CPU
0.4
cores idle
Действий/DAU/день
5
ходит в этот сервис
Записи/DAU/год
1.8 MB
~5 KB/день

Что растёт линейно с DAU

  • user_products — 1 row на покупку
  • purchase logs — append-only

Что растёт ступенями (нелинейно)

  • При больших промо — burst закупок
  • Inventory consistency — race conditions в multi-service flow

Узкое место

Что сломается первым: Sync wallet/bonus/achievement calls на каждую покупку

Когда: ~100,000 DAU

Как обойти: Inventory hold + async fulfillment; Saga pattern для distributed transaction

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1061 MB0.05262 MB0.30 GB32 MB0.3 GB0.4
10081 MB0.08409 MB0.51 GB48 MB0.5 GB0.6
1k102 MB0.1524 MB0.52 GB64 MB0.7 GB0.6
10k256 MB0.31.0 GB1.010 GB128 MB1.4 GB1.3
100k1.0 GB1.04.0 GB2.0100 GB512 MB6.0 GB3.0
1M8.0 GB6.016.0 GB4.01000 GB2048 MB26.0 GB10.0

Запросы к БД и Redis

Профиль: 4.0 q/HTTP-request (read: 2.0, write: 2.0), Redis: 0.5 ops/req, cache hit: 60%, avg query latency: 5 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.10.10.10.010
1k0.60.51.30.310
10k6.45.112.93.210
100k64.051.2128.732.010
1M640.0512.01286.9320.013
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Каждая покупка делает 3-4 sync вызова (wallet, bonus, achievement, auth) — нет distributed transaction.
  • Inventory consistency: race условия между local insert и remote wallet charge.
  • Use goose migrations (другой инструмент чем у большинства).

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-partner-service

light (polling) Доля общего RPS: 0.5%

Минимум RAM
256 MB
для запуска (0 юзеров)
Минимум CPU
0.4
cores idle
Действий/DAU/день
0.5
ходит в этот сервис
Записи/DAU/год
3.6 MB
~10 KB/день

Что растёт линейно с DAU

  • affilka_users — линейно по новым регистрациям
  • manual_user_activity — растёт по кол-ву событий
  • Hourly sync — фиксированный пик в начале часа

Что растёт ступенями (нелинейно)

  • 5 cron jobs synci с Affilka/Alanbase — burst в :00
  • Disabled Kafka consumers — реал-тайм недоступен (polling lag до 1ч)

Узкое место

Что сломается первым: manual_user_activity рост unbounded; hourly burst к Affilka API

Когда: ~100,000 DAU

Как обойти: Партицирование activity по месяцу; включить Kafka consumers; staggered cron windows

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1061 MB0.05262 MB0.30 GB32 MB0.3 GB0.4
10081 MB0.07409 MB0.52 GB48 MB0.5 GB0.6
1k102 MB0.1524 MB0.55 GB64 MB0.6 GB0.6
10k256 MB0.31.0 GB1.050 GB128 MB1.3 GB1.3
100k1.0 GB1.04.0 GB2.0500 GB512 MB5.0 GB3.0
1M4.0 GB4.016.0 GB8.04.9 TB2048 MB24.0 GB12.0

Запросы к БД и Redis

Профиль: 2.0 q/HTTP-request (read: 1.5, write: 0.5), Redis: 0.2 ops/req, cache hit: 50%, avg query latency: 5 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.00.00.00.010
1k0.20.10.10.010
10k1.61.20.90.310
100k16.012.08.73.210
1M160.0120.086.932.010
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Affilka/Alanbase синки — 5 hourly cron jobs. Spike нагрузки в начале каждого часа.
  • Disabled Kafka consumers (4 шт) — реал-тайм атрибуция отключена → polling lag до 1 часа.
  • manual_user_activity и affilka_users без партиционирования — рост неограничен.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-referral-service

light Доля общего RPS: 1%

Минимум RAM
256 MB
для запуска (0 юзеров)
Минимум CPU
0.4
cores idle
Действий/DAU/день
1
ходит в этот сервис
Записи/DAU/год
0.4 MB
~1 KB/день

Что растёт линейно с DAU

  • referrals — 1 row на новую регистрацию через линк
  • Closure table до глубины 5 — линейно от регистраций

Что растёт ступенями (нелинейно)

  • Monthly commission run (28-31 число, 23:59 UTC) — большой single-pass через всю closure table
  • Concurrency 16 sync calls к stats может перегружать stats-сервис

Узкое место

Что сломается первым: Monthly commission run scaling — sync calls к stats не справляются при росте дерева

Когда: ~100,000 DAU

Как обойти: Bulk batch к stats; ограничить concurrency 8; разбить на chunks по 10k участников

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1061 MB0.05262 MB0.30 GB0.3 GB0.4
10081 MB0.07262 MB0.30 GB0.4 GB0.4
1k102 MB0.1262 MB0.30 GB0.4 GB0.4
10k204 MB0.2524 MB0.55 GB0.7 GB0.7
100k819 MB1.02.0 GB1.050 GB3.0 GB2.0
1M3.0 GB4.08.0 GB2.0500 GB11.0 GB6.0

Запросы к БД и Redis

Профиль: 2.0 q/HTTP-request (read: 1.5, write: 0.5), Redis: 0.0 ops/req, cache hit: 0%, avg query latency: 5 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.00.00.00.010
1k0.30.50.20.010
10k3.24.81.60.010
100k32.048.016.30.010
1M320.0480.0163.50.010
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • **Monthly commission run** (23:59 UTC, дни 28-31) — отдельный пик от steady-state.
  • Closure table до глубины 5 — pagination обязателен на больших деревьях.
  • Concurrency 16 sync calls к stats — может перегружать stats-service.
  • Postgres 9 таблиц без TTL/partitioning.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-notifications-service

medium (multi-channel fan-out) Доля общего RPS: 0.1%

Минимум RAM
384 MB
для запуска (0 юзеров)
Минимум CPU
0.6
cores idle
Действий/DAU/день
10
ходит в этот сервис
Записи/DAU/год
10.7 MB
~30 KB/день

Что растёт линейно с DAU

  • notifications_log — линейно по событиям
  • Provider API calls (FCM/Email/SMS) — линейно

Что растёт ступенями (нелинейно)

  • Marketing campaigns — burst x10-100 за минуты
  • Provider rate limits (SMS 100/sec, FCM 600k/min)

Узкое место

Что сломается первым: Fan-out amplification: 1 событие → O(users × channels) вызовов

Когда: ~50,000 DAU

Как обойти: Batch sending через Kafka producer; rate-limit per provider; в priority queue по типу

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
10102 MB0.1262 MB0.51 GB64 MB0.4 GB0.6
100153 MB0.2409 MB0.53 GB96 MB0.6 GB0.7
1k204 MB0.3524 MB0.510 GB128 MB0.8 GB0.8
10k614 MB1.01.0 GB1.0100 GB256 MB1.9 GB2.0
100k4.0 GB3.04.0 GB2.01000 GB1024 MB9.0 GB5.0
1M24.0 GB12.016.0 GB4.09.8 TB4096 MB44.0 GB16.0

Запросы к БД и Redis

Профиль: 2.0 q/HTTP-request (read: 1.0, write: 1.0), Redis: 1.0 ops/req, cache hit: 70%, avg query latency: 10 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
100.00.00.00.010
1000.00.00.00.010
1k0.00.00.10.010
10k0.30.10.70.310
100k3.21.06.73.210
1M32.09.666.732.010
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • **Не stub — 26k LoC**, 4 Kafka consumer groups, 6 каналов (bell/popup/email/SMS/Viber/Telegram/WhatsApp).
  • Fan-out amplification: O(users × channels) sync вызовов на 1 inbound message.
  • Provider rate limits: SMS — 100/sec, FCM — 600k/min — учитывать.
  • Затраты SMS/email scale linearly с DAU.

Связи

См. граф зависимостей и Mermaid-диаграмму.

casino-boilerplate-service

n/a (template, не деплоится) Доля общего RPS: —

Минимум RAM
50 MB
для запуска (0 юзеров)
Минимум CPU
0.05
cores idle
Действий/DAU/день
0
ходит в этот сервис
Записи/DAU/год
0.0 MB
~0 KB/день

Что растёт линейно с DAU

  • Не применимо — это шаблон, не деплоится

Что растёт ступенями (нелинейно)

Узкое место

Что сломается первым:

Когда: ~0 DAU

Как обойти: При создании реального сервиса — заполнить эту секцию

Минимальные ресурсы по DAU

Включает app + Postgres + Redis (single instance, +30% headroom). Для HA умножай app ×2-4, DB ×2.

DAUApp RAMApp CPUDB RAMDB CPUDB Disk/yrRedisTotal RAMTotal CPU
1051 MB0.050.05 GB0.05
10051 MB0.050.05 GB0.05
1k51 MB0.050.05 GB0.05
10k51 MB0.050.05 GB0.05
100k51 MB0.050.05 GB0.05
1M51 MB0.050.05 GB0.05

Запросы к БД и Redis

Профиль: 0.0 q/HTTP-request (read: 0.0, write: 0.0), Redis: 0.0 ops/req, cache hit: 0%, avg query latency: 5 ms

DAURPS peakDB read QPSDB write QPSRedis QPSConnection pool
Pool sizing: MAX(10, ceil((rd_QPS + wr_QPS) × avg_query_ms / 1000 × 1.5))

Особенности и риски

  • Это шаблон для новых сервисов. Не сайзится и не деплоится.
  • При создании нового сервиса — клонируется и переименовывается.

Связи

См. граф зависимостей и Mermaid-диаграмму.