Поддержка нескольких валют и курсов в режиме реального времени
Введение
Онлайн-казино работают на рынках с разными валютами: 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. Расчёт конверсии
При поступлении ставки:
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 с отказоустойчивым кешем, точным хранением и логированием курсов, атомарными конверсиями ставок и выплат, защитой от волатильности и соблюдением регуляторных норм. При такой архитектуре платформа обеспечивает игрокам прозрачные и корректные операции в их родной валюте без простоев и ошибок.
Онлайн-казино работают на рынках с разными валютами: 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 с отказоустойчивым кешем, точным хранением и логированием курсов, атомарными конверсиями ставок и выплат, защитой от волатильности и соблюдением регуляторных норм. При такой архитектуре платформа обеспечивает игрокам прозрачные и корректные операции в их родной валюте без простоев и ошибок.