Поддержка нескольких валют и курсов в режиме реального времени

Введение

Онлайн-казино работают на рынках с разными валютами: EUR, USD, GBP, RUB и множеством локальных. Чтобы игроки могли делать ставки и получать выигрыши в собственной валюте, платформа должна динамически конвертировать суммы по актуальным курсам, обеспечивая прозрачность, точность и минимальные задержки.

1. Архитектура мультивалютности

1. Currency Service

Отдельный микросервис, отвечающий за получение, хранение и распространение курсов.
Экспонирует API `/rates?base=USD&symbols=EUR,GBP,RUB` и WebSocket-поток изменений.

2. Exchange Rate Provider

Внешние API (Fixer.io, Open Exchange Rates, банковские шлюзы) с гарантией свежести данных (обновление раз в минуту).
Гибкая настройка приоритета провайдеров и fallback при недоступности основного.

3. Кеширование и TTL

Redis-кеш с key=`rates: USD` и TTL=60 с для REST; Pub/Sub канал для WebSocket-обновлений без лишних запросов.

4. CDN для статики

Доступ к курсам через edge-вызовы (если regionale setting не критично оперативное значение).

2. Хранение и модель данных

Таблица `exchange_rates`

```sql
CREATE TABLE exchange_rates (
base_currency CHAR(3) NOT NULL,
target_currency CHAR(3) NOT NULL,
rate DECIMAL(18,8) NOT NULL,
fetched_at TIMESTAMP NOT NULL,
PRIMARY KEY (base_currency, target_currency)
);
```

Исторические курсы
Для аналитики и отката ошибочных обновлений: таблица `exchange_rates_history` с идентичной схемой + `updated_at`.

Precision и масштаб
8 знаков после запятой позволяют конвертировать любые суммы до центов с погрешностью <0.0001.

3. Конверсия ставок и выплат

1. Расчёт конверсии

При поступлении ставки:
  • ```pseudo
  • rate = getRate(playerCurrency, platformCurrency)
  • platformAmount = round(playerAmount rate, 2, ROUND_HALF_EVEN)
  • ```
  • Аналогично при выплате: расчет в обратную сторону с учётом комиссии.

2. Комиссии и спред

Определяются на уровне tenant/бренда, добавляются как множитель (`effectiveRate = rate (1 + spread)`).
Чёткая фиксация spread в запросе конверсии и в логе транзакции.

3. Атомарность операций

Все расчёты и списания происходят в транзакции БД, чтобы исключить рассинхрон между конверсией и бухгалтерской записью.

4. Обработка волатильности и риски

Lock-in курс

При старте сессии или при первой конверсии ставки курс «фиксируется» для всей игровой сессии игрока, чтобы исключить арбитраж при быстрых колебаниях.
Хранится в `player_sessions`.

Stale rate detection

Если `fetched_at` старше порога (например, 5 мин), конверсия запрещается до обновления курса.

Alerting

Алерты при падении числа успешных обновлений ниже SLA-уровня (например, <95 % в час) и при превышении допустимой волатильности (>1 % за 1 мин).

5. Интеграция с игровыми движками и микросервисами

gRPC/REST

Game Engine запрашивает конвертированные суммы через сервис `/convert?from=EUR&to=USD&amount=10.00`.
Обязательная передача метаданных: `session_id`, `player_id` для логирования.

Event-driven

При обновлении курсов Currency Service публикует событие `RateUpdated(base, target, rate)` в Kafka; консьюмеры (Analytics, Reporting) обновляют свои агрегаты.

6. Отказоустойчивость и масштабирование

Replica-set Redis

Sentinel или Cluster Mode для отказоустойчивого кеша.
Stateless Currency Service

Горизонтальное масштабирование через Kubernetes HPA по задержке ответов и QPS.
Circuit Breaker

Защита от зависания при недоступности внешних API: fallback на последний удачный курс или отказ в конверсии.

7. Безопасность и соответствие

TLS/SSL для всех внешних и внутренних вызовов.
Audit log

Запись всех запросов конверсии с курсом, timestamp и идентификаторами источника.
Регуляторные требования

Локальные законы могут требовать публикации курсов или ограничения спреда; эти параметры настраиваются per region.

8. Мониторинг и метрики

Prometheus

Метрики: `currency_rate_fetch_success_total`, `currency_rate_fetch_error_total`, `conversion_requests_total`, `conversion_latency_seconds`.
Grafana-дашборд

Время жизни курсов, частота обновлений, p95 latency конверсий, число отказов из-за stale rates.

Заключение

Поддержка мультивалютности в реальном времени требует выделенного Currency Service с отказоустойчивым кешем, точным хранением и логированием курсов, атомарными конверсиями ставок и выплат, защитой от волатильности и соблюдением регуляторных норм. При такой архитектуре платформа обеспечивает игрокам прозрачные и корректные операции в их родной валюте без простоев и ошибок.