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

Вступ

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