GH GambleHub

Architecture microservices

1) Pourquoi les microservices dans iGaming

Taux de changement : versions indépendantes des équipes (paiements, contenu, risques, tournois).
Fiabilité : une défaillance d'un service ne gâche pas tout le produit (limites de défaillance).
Échelle : skale horizontal des domaines « chauds » (portefeuille, lobby, strim).
Conformité : ségrégation des données par région/juridiction.

Quand ça ne vaut pas la peine : petite équipe/volume, pas de pratique DevOps, faible automatisation des tests - alors le monolithe modulaire est meilleur.

2) Domaines, frontières et équipes (DDD + Team Topologies)

Contours de domaine : Compte/Profil, CUS/Conformité, Paiements/Portefeuille, Contenu de jeu/Agrégation, Bonus/Missions, Tournois, Marketing/CRM, Reporting/BI.
Bounded Context = contrat de modèle de données et de langage.
Flux de modifications ↔ commandes : une commande = une boucle + son SLO.
BFF (Backend for Frontend) : façades séparées sous Web/Mobile/Partner afin de ne pas assembler une « orchestration » sur le client.

3) Communications : Synchron vs asynchron

Synchron (REST/gRPC) : lorsque vous avez besoin d'une réponse immédiate (vérification des limites au dépôt).
Asynchron (Kafka/NATS/SQS) : événements et processus d'arrière-plan (mise à jour du cashback, envoi, mise à jour des classements).

Règles :
  • Chemin critique = minimum de hops réseau.
  • Intégration inter-domaines - par le biais d'événements et d'API contractuelles.
  • Ne pas construire des « chaînes d'appels synchrones 5 + » en ligne → utiliser EDA/saga.

4) Contrats et versioning

Premier contrat : OpenAPI/AsyncAPI + Schema Registry (Avro/JSON Schema).
BouVer + compatibilité : l'ajout de champs ne brise pas les clients.
Contrats consommateurs-conducteurs (CDC) : Essais de véhicules en IC (contre les régressions).
Politique de déprécation : fenêtre de support (12-18 mois), télémétrie selon les anciennes versions.

5) Événements, sagas et consistance

Outbox/Transaction Log Tailing : enregistrement atomique « données + événement ».

Modèles de saga :
  • Orchestration (coordinateur central) pour les paiements/retraits.
  • Chorégraphie (réaction aux événements) pour les bonus/missions.
  • Idempotence : clés sur 'entityId + action + nonce', stockage du registre dedup.
  • Consistance : « externe » - à travers les événements ; « interne » - transactions au sein du service.

6) Données et stockage

Le principe du « store » : chaque service possède sa propre base de données (isolation des circuits).

Sélection du magasin par modèle d'accès :
  • Transactions/bilans - relationnels (PostgreSQL) avec des invariants stricts.
  • Événements/logs - append-only (Kafka/Redpanda).
  • Cache/sessions - Redis/KeyDB ; les leaders sont les Redis Sorted Sets.
  • La recherche est OpenSearch/Elastic.
  • Projections matérialisées en lecture (CQRS) - Listes/rapports rapides.

7) Fiabilité et durabilité

Timeouts/Retry with jitter/Retry-budget uniquement pour les opérations idempotent.
Circuit-breaker/Outlier-ejection entre les services.
Bulkhead : pools séparés sur les apstrymes « bruyants ».
Rate limits per-client/route, backpressure (503 + Retry-After).
Dead-letter + poison-message handling dans les files d'attente.

8) Observabilité (Observabilité)

Trace : OpenTelemetry ('trace _ id' à travers le shlyuz→servisy→BD).
Métriques : RPS, p50/p95/p99, error rate 4xx/5xx, saturation (CPU/mem/queue), métriques d'entreprise (TTP, TtW).
Logs : JSON structural, masque PII/PAN/IBAN, corelation par 'trace _ id'.
SLO/alertes : par route/fonction (par exemple, 'Deposit p95 ≤ 300 ms', 'success ≥ 98. 5%`).

9) Sécurité et conformité

Zero-Trust : mTLS servis↔servis (SPIFFE/SPIRE), certificats à courte durée de vie.
AuthN/Z : OAuth2/JWT (aud/scope/bou), délimitation attributaire des rôles.
Secrets : KMS/Secret Manager/Sealed Secrets, rotation des clés.
GDPR/localisation de données : clusters régionaux, géofencing sur une passerelle API.
Audit : journaux immuables (WORM), suivi des actions admin.

10) Déploiement et release

Conteneurs/K8s : un service = un deploy ; ressources/limites ; PodDisruptionBudget.
CI/CD : linters, unit/contract/integ-tests, scan de sécurité, SBOM.
Sorties : canary/blue-green/shadow, migration de schémas via expand-and-contract.
Skale automatique : HPA par CPU + RPS + p95 + queue-depth ; drain lors du retrait.

11) Productivité et coût

Profilage : p95/99 « par services et méthodes », graphiques flame.
Cache : read-through/write-through ; TTL/invalidité par événement.
Localisation des données : garder les données chaudes près du calcul.
FinOps : target de téléchargement 60-70 %, « warm pools », auto-pause des workers inactifs.

12) Modèles de domaine (iGaming)

12. 1 Paiements/Portefeuille

Services : 'payments-gw' (façade), 'wallet', 'psp-adapters-', 'fraud-check'.
Flux : 'init → reserve → capture/rollback' (saga).
События: `PaymentInitiated`, `PaymentAuthorized`, `PaymentSettled/Failed`.
Idempotence : 'Idempotency-Key', dedup dans 'wallet'.

12. 2 CUS/Conformité

Сервисы: `kyc-flow`, `doc-storage`, `sanctions-check`, `pep-screening`.
События: `KycSubmitted/Approved/Rejected`, `RiskScoreUpdated`.
Audit et ETA : file d'attente de tâches, case time-line, post-actions.

12. 3 Bonus/Missions

Services : 'bonus-engine', 'wallet-bonus', 'eligibility'.
Chorégraphie : « BetPlaced → BonusEngine → BonusGranted → WalletCredited ».
Protection contre les abus : subventions idempotent, limites, simulateur de règles.

12. 4 tournois/Liderboards

Services : 'tournament-svc', 'scoring', 'leader'.
Stockage : Redis ZSET + « rasage » périodique dans OLAP.
События: `ScoreUpdated`, `TournamentClosed`, `RewardIssued`.

13) Exemple « contrat + événement » (simplifié)

OpenAPI (fragment) - Wallet

yaml paths:
/v1/wallet/{userId}/credit:
post:
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreditRequest'
responses:
'202': { description: 'Enqueued' }
components:
schemas:
CreditRequest:
type: object required: [amount, currency, reason, idempotencyKey]
properties:
amount: { type: number }
currency: { type: string, example: UAH }
reason: { type: string, enum: [Deposit, Bonus, Adjustment] }
idempotencyKey: { type: string }

AsyncAPI (fragment) - événement

yaml channels:
wallet. credit. applied:
publish:
message:
name: WalletCreditApplied payload:
type: object required: [userId, amount, currency, sourceEventId]

14) Tests

Unit/Property-based pour les règles de domaine.
CDC (Pacte/Assertable) est un contrat-test de fournisseurs/consommateurs.
Intégration avec les courtiers locaux (Testcontainers).
E2E flow critique (registratsiya→depozit→start igry→vyvod).
Tests Chaos/Failover : Désactivation du PSP/chute du courtier/perte de zone.

15) Métriques et SLO (minimum)

Disponibilité des services : '≥99. 9 % pour le paiement/portefeuille.
Latitude p95 : API de chemin critique ≤ 300-500 ms.
Error budget: 0. 1–0. 5 % par trimestre, burn-alerts.
Files d'attente : lead time event (produce→consume), DLQ ≤ 0. 1%.
Affaires : TTP, TtW, FTD-success, KYC-TtV.

16) Chèques-feuilles

Conception du service

  • Délimitation claire du domaine et propriétaire des données.
  • Contrats OpenAPI/AsyncAPI + schémas dans Registry.
  • Les SLO/alertes sont définis ; métriques/remorques/logs intégrés.
  • Politiques de Timaout/Rétroactivité/Idempotence.
  • Migrations de schémas : expand-and-contract.

Avant la sortie

  • Les tests d'intégration Unit/CDC sont verts.
  • Itinéraire canarien et plan de repli.
  • Les routes de vitesse/de poids sont personnalisées.
  • Les secrets/clés/certificats tournent.
  • Les drapeaux et les follbacks sont préparés.

17) Anti-modèles

Le réseau est comme un bus de données : chaînes synchrones profondes au lieu d'événements.
Un « dieu » commun - BD sur tous les services.
L'absence d'idempotence → les doubles charges/charges.
Sorties sombres sans télémétrie et sans kill-switch.
Session cachée (collante partout au lieu de l'état extérieur).
Contrats « en code » sans version et CDC.
Logique dans une passerelle API au lieu de services (passerelle = mince).

18) Migration à partir d'un monolithe (Strangler Fig)

1. Allouer la façade-passerelle et la première boucle (par exemple, les paiements).
2. Retirer la logique binaire (outbox) du monolithe aux événements.
3. Transférer progressivement les endpoints vers un nouveau service (routage/poids canaris).
4. Comprimez le monolithe au « noyau » et éteignez-le.

19) Pile et infrastructure (exemple)

Communications : REST/gRPC, Kafka/NATS ; Schema Registry.
Stockages : PostgreSQL, Redis, OpenSearch, S3/MinIO ; OLAP — ClickHouse/BigQuery.
Conteneurs/orchestration : Docker, Kubernetes (Ingress/Gateway), Service Mesh (Istio/Linkerd) si nécessaire.
Passerelle : Envoy/Kong/Traefik/NGINX.
CI/CD: GitHub Actions/GitLab CI + ArgoCD/Flux; Pact/OWASP/ZAP.
Observability: OpenTelemetry, Prometheus, Tempo/Jaeger, Loki.

20) Triche finale

Concevez les limites par domaine et responsabilité des données.
Synchron - seulement là où une réponse est nécessaire maintenant ; le reste est des événements.
Contrats/régimes/CDC - Assurance régression.
Saga + outbox + idempotence - la base de la fiabilité.
L'observation et le SLO ne sont pas une option, mais un critère « prêt ».
Sorties par canary/blue-green, migrations - expand-and-contract.
Sécurité/conformité : mTLS, JWT, KMS, données régionales.
D'abord le monolithe modulaire, puis l'évolution - si l'échelle et l'équipe sont prêtes.

Contact

Prendre contact

Contactez-nous pour toute question ou demande d’assistance.Nous sommes toujours prêts à vous aider !

Commencer l’intégration

L’Email est obligatoire. Telegram ou WhatsApp — optionnels.

Votre nom optionnel
Email optionnel
Objet optionnel
Message optionnel
Telegram optionnel
@
Si vous indiquez Telegram — nous vous répondrons aussi là-bas.
WhatsApp optionnel
Format : +code pays et numéro (ex. +33XXXXXXXXX).

En cliquant sur ce bouton, vous acceptez le traitement de vos données.