Unterstützung mehrerer Währungen und Kurse in Echtzeit

Einleitung

Online-Casinos arbeiten in Märkten mit verschiedenen Währungen: EUR, USD, GBP, RUB und viele lokale. Damit Spieler in ihrer eigenen Währung wetten und Gewinne erzielen können, muss die Plattform die Beträge dynamisch zu aktuellen Kursen umrechnen, um Transparenz, Genauigkeit und minimale Verzögerungen zu gewährleisten.

1. Architektur der Mehrwährungen

1. Currency Service

Ein separater Microservice, der für die Entgegennahme, Speicherung und Verteilung von Kursen verantwortlich ist.
Belichtet API '/Preise? base = USD & symbols = EUR, GBP, RUB 'und WebSocket-Änderungsfluss.

2. Exchange Rate Provider

Externe APIs (Fixer. io, Open Exchange Rates, Banking Gateways) mit Datenfrischgarantie (Aktualisierung einmal pro Minute).
Flexible Einstellung der Providerpriorität und Fallback, wenn die Hauptpriorität nicht verfügbar ist.

3. Caching und TTL

Redis-Cache mit key = 'rates: USD' und TTL = 60s für REST; Pub/Sub-Kanal für WebSocket-Updates ohne unnötige Anfragen.

4. CDN für Statik

Zugriff auf Kurse über Edge-Calls (wenn regionale Einstellung nicht kritisch ist).

2. Datenspeicherung und -modell

Tabelle' 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)
);
```

Historische Kurse
Für Analysen und Rollbacks von fehlerhaften Updates: Tabelle' exchange _ rates _ history 'mit identischem Schema +' updated _ at'.

Präzision und Maßstab
Mit 8 Dezimalstellen können Sie beliebige Beträge bis zu Cent mit einem Fehler <0 konvertieren. 0001.

3. Umwandlung von Wetten und Auszahlungen

1. Berechnung der Konversion

Bei Eingang der Wette:
  • ```pseudo
  • rate = getRate(playerCurrency, platformCurrency)
  • platformAmount = round(playerAmount rate, 2, ROUND_HALF_EVEN)
  • ```
  • Ähnlich bei der Auszahlung: Abrechnung in umgekehrter Richtung unter Berücksichtigung der Provision.

2. Provisionen und Spread

Definiert auf Tenant/Markenebene, addiert als Multiplikator ('effectiveRate = rate (1 + spread)').
Klare Fixierung von Spread in der Conversion-Anfrage und im Transaktionsprotokoll.

3. Atomarität der Operationen

Alle Abrechnungen und Abbuchungen finden in der DB-Transaktion statt, um eine Fehlfunktion zwischen Conversion und Buchhaltungseintrag auszuschließen.

4. Umgang mit Volatilität und Risiken

Lock-in-Kurs

Zu Beginn der Sitzung oder bei der ersten Umstellung des Einsatzes wird der Kurs für die gesamte Spielsitzung des Spielers „festgelegt“, um eine Arbitrage bei schnellen Schwankungen auszuschließen.
Gespeichert in 'player _ sessions'.

Stale rate detection

Ist 'fetched _ at' älter als die Schwelle (z.B. 5 min), ist die Konvertierung bis zur Kursaktualisierung verboten.

Alerting

Alerts, wenn die Anzahl der erfolgreichen Updates unter das SLA-Niveau fällt (z. B. <95% pro Stunde) und die zulässige Volatilität überschritten wird (> 1% in 1 Minuten).

5. Integration mit Game Engines und Microservices

gRPC/REST

Game Engine fordert konvertierte Beträge über den Dienst '/convert? from=EUR&to=USD&amount=10. 00`.
Obligatorische Übertragung von Metadaten: 'session _ id', 'player _ id' zur Protokollierung.

Event-driven

Wenn die Kurse aktualisiert werden, veröffentlicht Currency Service das Ereignis' RateUpdated (base, target, rate) 'in Kafka; Consumer (Analytics, Reporting) aktualisieren ihre Aggregate.

6. Fehlertoleranz und Skalierung

Replica-set Redis

Sentinel oder Cluster-Modus für einen fehlertoleranten Cache.
Stateless Currency Service

Horizontale Skalierung über Kubernetes HPA durch verzögerte Antworten und QPS.
Circuit Breaker

Schutz vor Einfrieren, wenn externe APIs nicht verfügbar sind: Fallback auf den letzten erfolgreichen Kurs oder Ablehnung der Konvertierung.

7. Sicherheit und Compliance

TLS/SSL für alle externen und internen Anrufe.
Audit log

Aufzeichnung aller Conversion-Anfragen mit Kurs, Zeitstempel und Quell-IDs.
Regulatorische Anforderungen

Lokale Gesetze können die Veröffentlichung von Kursen oder die Begrenzung des Spreads erfordern; diese Parameter werden per region konfiguriert.

8. Monitoring und Metriken

Prometheus

Метрики: `currency_rate_fetch_success_total`, `currency_rate_fetch_error_total`, `conversion_requests_total`, `conversion_latency_seconds`.
Grafana-daschbord

Kurslebensdauer, Aktualisierungsrate, p95 Latenzumwandlungen, Anzahl der Ausfälle aufgrund von Stale-Raten.

Schluss

Die Echtzeitunterstützung für mehrere Währungen erfordert einen dedizierten Currency Service mit fehlertolerantem Cache, genauer Speicherung und Protokollierung von Kursen, atomaren Umrechnungen von Raten und Auszahlungen, Schutz vor Volatilität und Einhaltung von regulatorischen Vorschriften. Mit dieser Architektur bietet die Plattform Spielern transparente und korrekte Operationen in ihrer Heimatwährung ohne Ausfallzeiten und Fehler.