Рейтинги в реальном времени: техническая архитектура
Реал-тайм рейтинг — это связка сервисов, которая превращает миллионы игровых событий в обновляемые позиции за сотни миллисекунд, сохраняя честность, аудируемость и экономическую управляемость. Ниже — практичный конструктор от требований до эксплуатации.
1) Требования и целевые показатели
Латентность до UI: ≤ 200–300 мс p95 от прихода события до обновления позиции.
Точность: корректный зачёт «лучших N»/дивизионов/тай-брейков при нагрузке и сбоях.
Доступность: ≥ 99.9% за период турнира; деградация без потери целостности.
Идемпотентность: «ровно один раз» на уровне начислений, «по крайней мере один раз» на транспорте.
Масштаб: горизонтальный рост по регионам/дивизионам/командам (top-K на шарде).
Аудит: неизменяемые логи правил, событий, начислений и выдач.
2) Системная схема (уровень 10 000 ft)
Клиент → Event Ingest → Scoring Engine → Stream Aggregator (Top-K/Top-M) → Write-Optimized Store → Hot Cache/Edge → UI/Comms → Rewards/Claim
Фоново: Snapshotter, Anti-Fraud/RG, Analytics & A/B, Audit/Observability.
3) Приём событий (Event Ingest)
Задачи: защита от дублей, всплесков, сетевых потерь.
Идемпотентность: каждое событие имеет `event_uuid`; проверка «видели/начислили».
Семантика доставки: транспорт — at-least-once, учёт очков — exactly-once.
Backpressure: очереди с динамическими партициями; при перегрузке — приоритизация «активных» туров.
Временные окна: допускаем late events (например, до 90 сек) — маршрутизируем в «окно пересчёта».
Время: серверное UTC, на клиенте — только отображение локали.
4) Подсчёт очков (Scoring Engine)
Принципы: версионируемые правила, анти-pay-to-win, лёгкий откат.
Версионирование: `rule_set_id` + feature-flags per-region/division.
Модели: multiplier (`Score = round(100log2(Win/Bet+1))`), win-based с лог-кривой, wager-based (только как фоновая мета).
Зачёт «лучших N»: держим структуру top-N на игрока/день/тур; суммирование/медиана по формату.
Исключения: бонусные средства `coef_bonus ≤ 0.5` или `0`; кап per spin/day; квоты на провайдера.
Тай-брейк: 1) более раннее достижение итогового скoра; 2) большее разнообразие; 3) детерминированный seed.
5) Стрим-агрегация и топ-K
Цель: быстро пересчитывать позиции без сканирования всего множества.
6) Хранение: write vs read
Write-optimized store: лог начислений, состояния «best-N», тай-брейки, метаданные (только запись/апдейты).
Read-optimized store (Query): денормализованные «витрины» для UI: топ-100, «моя позиция», «топ дня/дивизиона», вклад в команду.
Снимки (Snapshotter): почасовые «снепшоты» лидерборда; быстрый rollback/replay, отчёты и аудит.
Согласованность: eventual для широких списков, read-your-writes для «моей позиции».
7) Кэш и Edge
Горячий кэш: последние позиции и счёт игроков на шарде; TTL 1–5 сек; инвалидация по событию.
Edge-слой/CDN: статические блоки, «холодные» страницы результатов, но не логика начислений.
Fallback: при деградации — «бронзовый режим»: обновление UI каждые X секунд + блок тяжёлых виджетов.
8) Время, окна и таймзоны
Единое «истинное» время: UTC на сервисах; дедлайны в UTC.
Локализация: преобразование времени на клиенте (часовой пояс пользователя).
Границы: «мягкое окно» закрытия 1–3 мин для сетевых лагов (в T&C).
Идём ворд-класс: clock-skew мониторинг, NTP-алерты, измерение дрейфа.
9) Борьба с поздними и дублирующимися событиями
Late events: держим «reconciliation window»; пересчёт локально + «спокойная» корректировка позиций с лента уведомлений.
Дубли: `event_uuid` + (player, game, bet, ts) в узком окне; журнал «seen».
Идемпотентность начислений: транзакции «событие → изменения» со статусом applied/rolled_back.
10) Анти-фрод и RG (встроено в пайплайн)
Поведенческий скоринг: равномерные интервалы, сверхскорость, «без шума» — флаги.
Граф связей: общие девайсы/IP/платежи → кластеры; холды наград, ручная проверка.
Квоты и капы: N лучших попыток/день, квоты на один слот/провайдера, кап очков per spin/day.
Бонусные средства: коэффициенты/исключение.
RG: очки начисляются только в пределах добровольных лимитов (время/депозиты/потери); напоминания о перерывах.
11) Мульти-регион и отказоустойчивость
Актив-актив по регионам: региональные шарды + глобальный свод; маршрутизация по близости.
RTO/RPO: RTO < 15 мин (фолбэк на снепшоты), RPO=0 для начислений (идемпотентный реплей лога).
Partition-tolerance: при сетевом разрыве — локальный лидерборд, последующая консолидация и мягкая коррекция позиций.
FX и валюты: если призы в разных валютах — фиксируем момент конвертации, FX-буфер 1–3%.
12) Безопасность и приватность
Данные: минимизация (псевдонимы, без PII в агрегаторе), шифрование «в полёте» и «на покое».
Доступ: принцип наименьших привилегий, секреты в KMS, аудит доступа.
T&C/юрисдикции: логи правил/версий, гео-блоки, возрастные ограничения.
13) Наблюдаемость и SRE-практики
SLO: UI-лаг ≤ 300 мс p95, Claim-время ≤ 10 мин p95, аптайм ≥ 99.9%.
Метрики: events/sec, доля дублей/отбракованных, late-rate, heap-рост топ-K, лаг стрима, ошибки начислений, claim-rate.
Трейсинг: сквозной (ingest → scoring → cache → UI).
Алерты: стоп-кнопка (disable тяжелые эксперименты/уменьшить N лучших), авто-деградация.
Post-mortem: RCA за 24–48 ч, список action items, error-budget policy.
14) Rewards & Claim
Автонаграда: при close-событии — рассчёт позиций, выдача, квитанции.
Claim-окно: ≤ 72 часа, ретраи доставки, детерминированный порядок выплат.
Прозрачность: история наград в профиле: правило, время, сумма, источник.
Холды: для редких/ценных призов до KYC/AML.
15) A/B-эксперименты и эволюция схем
Что тестировать: N лучших (10/20), кап per spin (on/off), бонус за разнообразие (0/50/100), тип агрегации (сумма/медиана).
Рандомизация: по регионам/каналам/кластерам — избегаем перетеканий.
Guardrails: RTP, жалобы/10k, RG-сигналы — не ухудшаются.
Миграции: совместимость схем хранения, двойная запись (dual-write) на время миграции.
16) UX-паттерны real-time рейтингов
Центр рейтинга: правило победы, таймер, ваш счёт, оставшиеся попытки, next reward.
Живой фидбек: «+40 очков за x3», «осталось 2 попытки из 20», «ты поднялся на 3 места».
Витрины: общий топ-100, «моя позиция», «топ дня/дивизиона», вклад в команду.
A11y: контраст, крупные числа, фокус-стейты, озвучивание прогресса.
Локализация: дедлайны/таймеры в локальной TZ, многоязычие.
17) Частые сбои и сценарии деградации
18) Чеклист запуска real-time рейтингов
Правила/Экономика
- Формула, N лучших, тай-брейк, дивизионы
- RewardRate, ширина выплат, вейджеры, claim ≤ 72 ч
Техника
- Идемпотентный Ingest, Late-window, шардирование
- Stream-Aggregator (топ-K/Top-M), Snapshotter
- Hot Cache/Edge, Health/Status API, стоп-кнопка
Безопасность/RG
- Поведенческий скоринг, граф связей, капы/квоты
- RG-лимиты, напоминания, KYC/AML для крупных призов
Данные/A/B
- Дашборды: лаг, late-rate, дубли, fairness-метрики
- План экспериментов и guardrails, dual-write при миграциях
UX
- Центр рейтинга, микро-фидбек, A11y, локализация
- Краткие правила в 1 экран + полные T&C
Надёжный рейтинг в реальном времени — это не один сервис, а дисциплинированная экосистема: идемпотентный приём, версионируемый скоринг, стрим-агрегация топ-K, быстрый кэш, снимки состояния и встроенные анти-фрод/RG-механизмы. Добавьте строгие SLO/SLA, понятный UX и проверку изменений через A/B — и вы получите лидерборды, которым доверяют игроки, а продукт получает предсказуемый рост Retention, Stickiness и LTV.