Vue d’ensemble du pipeline

Stream-Ingest → Validateurs de features → Persistance
                                            ↓
                                       Bus d'événements (PG LISTEN/NOTIFY)
                                            ↓
                              ┌────────────────────┐
                              │ Daemon de décision │ (config par tenant)
                              └─────────┬──────────┘
                                        ↓
                                  Action validée
                                        ↓
                                  Feedback résultat
                                        ↓
                              Entraînement / Tuning du modèle

La plateforme convertit les flux de données bruts en décisions convergentes via un pipeline délibérément étagé. Chaque étape a une responsabilité unique et émet des événements durables pour la suivante.

Cœur événementiel

  • Bus d’événements. PostgreSQL LISTEN/NOTIFY transporte les événements entre daemons. Les événements sont persistés en table durable, pas seulement diffusés — les consommateurs peuvent rejouer depuis un curseur après une reconnexion.
  • Livraison at-least-once. Les consommateurs accusent réception des événements traités. Les événements non acquittés sont relivrés après timeout. L’idempotence est la responsabilité du consommateur.
  • Replay tracé par curseur. Chaque consommateur maintient son propre curseur. Après une déconnexion, il reprend là où il s’est arrêté — aucun événement perdu, aucun doublement au-delà des sémantiques de retry configurées.

Pipeline ML

  • Modèles. XGBoost entraîné sur les features historiques, avec ONNX Runtime pour l’inférence (2–5× plus rapide que le framework d’entraînement).
  • Sorties. Les modèles classifient les régimes selon trois dimensions — direction, volatilité, qualité. Pas de prévision ponctuelle spéculative.
  • Tuning des hyperparamètres. Optuna avec walk-forward holdout, vagues champion/challenger, quality gates.
  • Boucle de feedback. Le résultat de chaque décision est enregistré et réinjecté dans le tour de tuning suivant.

Modèle multi-tenant

L’isolation des tenants est appliquée à deux niveaux :

  • Stored procedures. Toutes les opérations côté tenant passent par des stored procedures qui imposent la propriété. Les écritures directes en table par du code tenant ne sont pas permises.
  • Row-level security. Le RLS Postgres comme garde-fou. Même si la logique applicative a un bug, le RLS empêche tout accès inter-tenant aux données.

La configuration par tenant couvre :

  • Clés et limites de débit.
  • Kill-switch. Override opérateur pour désactiver un tenant immédiatement sans redéploiement.
  • Profil de risque. Paramètres de seuil par classe de décision.

Validateurs

Trois endroits où la validation se produit :

  1. Avant persistance. Les événements stream qui échouent à la validation sont marqués, pas droppés silencieusement. Les opérateurs les voient dans le dashboard.
  2. Avant entraînement du modèle. Les features utilisées pour l’entraînement sont re-validées contre le schéma. Une dérive déclenche une alerte avant que les modèles ne soient ré-entraînés.
  3. À l’exécution. Les validateurs de features tournent en continu avec auto-récupération DATAMISSING — quand une feature attendue est absente, le daemon retombe sur un défaut documenté et émet un événement structuré.

Observabilité

  • 21 tableaux de bord live. Heartbeat, latence, détection de dérive, distribution des décisions, volume par tenant.
  • Logging structuré. Console, fichier et base de données — mêmes événements de log lisibles depuis les trois avec la même requête.
  • Monitoring de santé. Chaque daemon émet des événements de santé à cadence fixe. Les événements manquants déclenchent un page.

Mécanismes prêts pour la production

  • Circuit breakers par source de données — les pannes dégradent gracieusement plutôt que de cascader.
  • Alerting email et XMPP pour les événements visibles à l’opérateur.
  • Valeurs par défaut universelles pilotées par config. Mappings de sources, chaînes de fallback, conversions d’unités, seuils — tout en JSON. Pas de magic number dans le code.
  • Isolation de processus via tmux + Devuan — les daemons peuvent être redémarrés individuellement sans coordination.

Ce que ce n’est pas

  • Pas une plateforme d’autoscaling style Kubernetes. Ceci tourne sur un petit nombre de machines bien comprises avec placement délibéré des daemons.
  • Pas “installer et oublier”. Les jeux de tokens, versions de modèles, configs de tenants et tableaux de bord requièrent attention opérateur.
  • Pas générique. La plateforme reflète une classe spécifique de problèmes de décision haute fréquence — l’adapter à une charge très différente est le service Développement.