Pourquoi les casinos passent à l'architecture modulaire
Pourquoi le casino est modulaire
Le monolithe historique freine la croissance : chaque changement tire la sortie de l'ensemble du système, l'intégration des fournisseurs et des PSP frappe SLO, les mises à jour de conformité - dans tout le code. L'architecture modulaire (domain-driven + API contractuelles + événements) permet :- Sortir rapidement les fiches et connecter les fournisseurs sans coordination « tout le monde avec tout le monde » ;
- Mise à l'échelle sélective (vidéo en direct séparée de la caisse, portefeuille séparé du catalogue de jeux) ;
- Isoler les risques (une erreur dans la promo ne fait pas tomber le portefeuille) ;
- Respecter les licences (logging/versions/stratégies dans les limites du domaine) ;
- Réduire le TCO grâce à des contrats clairs, la réutilisation et l'automatisation.
Carte des domaines (exemple de répartition)
Wallet/Ledger - argent, devises spéculatives, soldes bonus, PITR, audit.
Cashier/Payments - PSP, on-ramp/off-ramp, KYT, webhooks idempotent.
Gaming Bridge - adaptateurs de fournisseurs, normaliser round/bet.
Catalogue/Lobby - jeux, fournisseurs, fishering et règles d'affichage.
Promo/Bonus - règles des actions, bons, wager.
KYC/AML/RG - contrôle d'identité, sanctions/RER, limites et auto-exclusion.
Experience - Frontende, CDN, i18n, A/B, Telegram WebApp.
Télémétrie/Analytics - événements, vitrines, ML/IA.
Conformité et audit - rapports MGA/UKGC, archives WORM.
Principes de l'architecture modulaire
1. Frontière DDD (contexte boundé). Maîtrise claire des données et de la logique.
2. API-premier + événements. OpenAPI/AsyncAPI, JSON-Schema, tests contractuels.
3. Versioning et compatibilité. 'v1 → v1. 1 → v2` (expand→migrate→contract).
4. Idempotency & Exactly-once-intent. Clés de requête, déduplication des événements.
5. Sécurité par défaut. mTLS, signatures HMAC, JWT courts, RBAC/ABAC.
6. Des versions indépendantes. Canaris/bleu-vert, les migrations de « deux écrivains » sont interdites.
7. L'observabilité. "traceId', métrique SLO par module.
8. Les drapeaux de ficha. Trafic/géo/segments d'user, retours sécurisés.
Couche intégrations : comment connecter les fournisseurs et PSP
Modèle adaptateur/pont : chaque fournisseur de jeux/paiement est un plugin avec un seul contrat de plateforme.
Jeux : normalisation 'roundId/betId/status', bugs mapping, limites de cache.
Paiements : interface unique 'authorize/capture/refund/payout', webhooks avec idempotence.
Désactivation : l'adaptateur défectueux est mis en maintenance sans affecter les autres.
Exemple de contrat (fragment OpenAPI) :yaml post /wallet/debit:
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/DebitRequest@v1'
responses:
'200': { $ref: '#/components/schemas/DebitResult@v1' }
'409': { description: IDEMPOTENT_REPLAY }
Les événements comme « système circulatoire »
Shina (Kafka/NATS) → événements :- `bet. placed`, `round. settled`, `payout. requested/approved`, `kyc. verified/failed`, `rg. limit_set`, `bonus. issued/consumed`, `cashier. webhook. received`, `wallet. hold/release`, `alert. slo_breach`.
- Les événements n'annulent pas le passé ; ajustements - par des événements compensateurs distincts.
- Chaque module n'écrit que ses événements originaux, dérivés - comme de nouveaux thèmes.
Données : couches et cohérence
OLTP par module : Postgres/MySQL/KeyDB - transactions isolées.
OLAP/vitrines : ClickHouse/BigQuery sont construits à partir d'événements ; L'OLTP et l'analyse ne sont pas mélangés.
Feature Store/ML : couche indépendante de l'OLTP avec les versions fich et TTL.
Cohérence : Stratégique eventual entre les modules et pour l'argent - actions locales ACID + idempotent aux frontières.
Dépliage et mise à l'échelle
Conteneurs (Docker/K8s) : auto-skate modulo (wallet - CPU/IO ; Vidéo en direct - réseau ; bridge — RPS).
Isolation du périmètre : politiques de réseau, secrets individuels/clés par module, différents entrepôts PII/argent/télémétrie.
Trafic-shaping : drapeaux de ficha, partage canarien, itinéraires régionaux.
DR/HA: Multi-AZ; un atout pour l'argent, un atout pour la lecture/les médias.
La conformité « coule » dans les modules
KYC/AML/RG est son propre module avec des politiques et un journal de décisions (« policyVer »).
Audit/WORM est un entrepôt d'événements d'argent/rounds/paiement immuable.
Déclaration - exportations par juridiction (MGA/UKGC), SLA pour l'exhaustivité/actualité.
Exemple de flux
Taux → calcul → paiement
1. 'gaming-bridge' envoie 'bet. placed` (idempotent).
2. 'wallet'fait 'hold' et publie 'wallet. hold`.
3. 'gaming-bridge' obtient le résultat du fournisseur → 'round. settled`.
4. 'wallet' compte 'settle' (release/payout) → 'wallet. settled`.
5. 'promo' consomme des événements et attribue un bonus → 'bonus. issued`.
Caisse (dépôt)
1. 'cashier' crée 'payment. intent` с `Idempotency-Key`.
2. PSP appelle le webhook → 'cashier. webhook. received`.
3. `wallet. credit 'en fait → événement pour les analystes et RG.
Modifications sans interruption de service (expand→migrate→contract)
1. Expand : ont ajouté des champs/endpoint à 'v1. 1 ', les anciens clients ne cassent pas.
2. Migrate : les consommateurs lisent le nouveau, écrivent dans les deux versions (dual-write uniquement pour les non-monétaires).
3. Contrat : annoncé EOL'v1. 0 ', supprimé après N semaines comme prévu.
Ingénierie de plateforme
Golden Paths : modèles de modules (repo-ascéléon, CI/CD, alertes, SLO, secrets).
Tests contractuels : Tests Pact/AsyncAPI dans CI ; un environnement d'intégration avec des fournisseurs faux.
Annuaire de services (Backstage) : Qui est le propriétaire, SLA, versions API, ruckbooks d'incident.
Métriques du succès de la modularité
Lead time de l'idée à la version pro ↓ X fois.
Taux de diffusion par module ↑ (par jour/semaine), taux de change-fail ↓.
MTTR sur les incidents de ↓ (en raison de l'isolement).
Infra cost/GGR est stable ou ↓ lorsque le trafic augmente (skale sélectif).
Le temps d'intégration du fournisseur/PSP (de l'exposé à la prod) est ↓.
Anti-modèles
« Microservices pour microservices ». Sans limites de données claires, la connectivité et la complexité augmentent.
OBD/schémas communs entre les modules. Tue l'isolement et les rejets indépendants.
Événements sans version/contrat. Les consommateurs sont brisés « tranquillement ».
Dual-write pour l'argent. Le risque d'incohérence n'est que des étapes idempotentes à travers un seul écrivain.
Un « calque utilitaire » global avec tout dans une rangée. Il se transforme en monolithe caché.
Pas de drapeaux de ficha et de kill-switch. Toute erreur frappe tout le monde.
Mélange OLTP/OLAP. Les rapports freinent les paris/portefeuille.
Pas d'observation. Il n'y a rien pour mesurer le SLO et relier les incidents.
Chèque de passage à l'architecture modulaire
Stratégie et domaines
- Des contextes boundés, des propriétaires et des KPI par module ont été définis.
- Carte des interactions : API/événements, criticité et SLO.
Contrats et sécurité
- OpenAPI/AsyncAPI + JSON-Schema; version et cycle de vie.
- mTLS/HMAC, JWT courts, RBAC/ABAC aux frontières.
Données
- Les OLTP séparés ; les événements sont la source de l'OLAP.
- Idempotency sur API/webhooks, déduplication des messages.
CI/CD et versions
- Canaria/bleu-vert, drapeaux ficha, auto-skate modulo.
- Tests contractuels dans l'IC ; un environnement avec des fournisseurs faux.
Observabilité
- Logs/métriques/tracés avec 'traceId' ; SLO-dashboards.
- Alertes par métriques d'entreprise (VOID, reject, payout lag).
Conformité
- WORM-archives d'argent/rounds, exportation de rapports réglementaires.
- KYC/AML/RG en tant que module distinct avec le journal des solutions.
Mini-exemples
L'événement 'round'. settled@v1`:json
{
"event":"round. settled", "v":"1", "roundId":"R-2025-10-17-evo-23", "gameId":"evo_blackjack_23", "bets":[{"betId":"b_92f","playerId":"p_1","stake":"10. 00","payout":"15. 00","outcome":"WIN"}], "ts":"2025-10-17T14:23:13. 120Z", "traceId":"tr_5f1"
}
Portefeuille idempotent :
http
POST /wallet/settle
X-Idempotency-Key: 9a7f-2b1c
{
"roundId":"R-2025-10-17-evo-23", "operations":[{"playerId":"p_1","delta":"5. 00","currency":"EUR"}]
}
L'architecture modulaire transforme une plate-forme de casino de la « moissonneuse fragile » en une composition de domaines fiables, chacun avec ses propres contrats, données et SLO. Cela accélère les intégrations et les versions, permet une mise à l'échelle sélective, simplifie la conformité et réduit les risques d'incidents. Commencez par mettre en évidence les frontières de domaine, les contrats et les événements, « tisser » la sécurité et l'observabilité - et vous obtiendrez une plate-forme qui grandit avec le produit plutôt que de le freiner.