Aller au contenu

PLAN D'ARCHITECTURE - PLATEFORME MECAPY

🏗️ ARCHITECTURE PROPOSÉE : Hybrid Task Orchestration System

Section intitulée « 🏗️ ARCHITECTURE PROPOSÉE : Hybrid Task Orchestration System »
  • ❌ Serverless Functions limitées (1000 max chez Scaleway)
  • ✅ Provider français/européen souhaité
  • ✅ Stack actuelle : FastAPI, Keycloak, Scaleway Object Storage
  • ✅ Besoin : Calculs courts (secondes) ET longs (heures/jours)
  • ✅ Multi-tenant avec isolation sécurisée

Niveau 1 : API Gateway & Orchestration (FastAPI actuelle)

Section intitulée « Niveau 1 : API Gateway & Orchestration (FastAPI actuelle) »
┌─────────────────────────────────────────┐
│ FastAPI API (Clever Cloud) │
│ - Authentification Keycloak │
│ - Gestion Tasks/Workflows/Studies │
│ - File d'attente Redis/BullMQ │
│ - Métadonnées PostgreSQL (Scaleway) │
└─────────────────────────────────────────┘

Rôle :

  • Réception des requêtes utilisateurs
  • Validation, authentification, autorisation
  • Dispatch des tâches vers workers
  • Gestion du cycle de vie (statut, résultats, notifications)

Niveau 2 : Worker Pool Dynamic (Kubernetes sur Scaleway Kapsule)

Section intitulée « Niveau 2 : Worker Pool Dynamic (Kubernetes sur Scaleway Kapsule) »
┌──────────────────────────────────────────────────────┐
│ Scaleway Kapsule (Kubernetes managé) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
│ │ Worker Pod 1 │ │ Worker Pod 2 │ │ Worker Pod N ││
│ │ (Python) │ │ (Python) │ │ (Python) ││
│ │ - Celery │ │ - Celery │ │ - Celery ││
│ │ - Docker │ │ - Docker │ │ - Docker ││
│ └──────────────┘ └──────────────┘ └──────────────┘│
│ │
│ Auto-scaling basé sur charge (HPA) │
└──────────────────────────────────────────────────────┘

Technologie recommandée :

  • Celery : Système de task queue distribué (Python-native)
  • Redis : Broker de messages + résultats backend
  • Kubernetes HPA : Auto-scaling horizontal (2-50 workers)
  • Docker : Isolation des tâches utilisateur

Avantages :

  • Scalabilité infinie (pas de limite de 1000)
  • Workers dynamiques (scale up/down automatique)
  • Isolation sécurisée (chaque task dans son conteneur)
  • Provider français (Scaleway Kapsule = Paris/Amsterdam)

Niveau 3 : Storage & Résultats (Scaleway Object Storage)

Section intitulée « Niveau 3 : Storage & Résultats (Scaleway Object Storage) »
┌─────────────────────────────────────────┐
│ Scaleway Object Storage (S3) │
│ - Inputs utilisateurs │
│ - Outputs calculs │
│ - Logs d'exécution │
│ - Artefacts (meshes, résultats Code_Aster) │
└─────────────────────────────────────────┘

Utilisateur → FastAPI → Validation → Redis Queue
PostgreSQL (métadonnées)
Celery Worker poll Redis → Pull inputs (S3)
Exécution Python/Code_Aster (Docker isolé)
Push résultats (S3) → Update PostgreSQL (status: completed)
Notification utilisateur (webhook/SSE)
Utilisateur → FastAPI → PostgreSQL (métadonnées)
S3 (résultats signés URL)

Pourquoi Celery ?

  • ✅ Natif Python (intégration simple avec FastAPI)
  • ✅ Supporte tâches courtes ET longues
  • ✅ Priorités de tâches (fast-lane pour calculs courts)
  • ✅ Retry automatique, timeout, rate limiting
  • ✅ Monitoring avec Flower (UI web)

Configuration Redis :

  • Redis Managed Database (Scaleway) : €10/mois pour débuter
  • 3 queues :
    • high_priority : calculs < 5s (FIFO strict)
    • default : calculs < 5min
    • long_running : calculs > 5min (throttled)

Setup recommandé :

# Deployment YAML simplifié
apiVersion: apps/v1
kind: Deployment
metadata:
name: mecapy-worker
spec:
replicas: 3 # Auto-scale 2-50
template:
spec:
containers:
- name: celery-worker
image: mecapy/worker:latest
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2000m"
memory: "4Gi"
env:
- name: CELERY_BROKER_URL
value: "redis://redis.scaleway.com:6379/0"

Auto-scaling basé sur :

  • CPU > 70% → Scale up
  • Queue depth > 100 messages → Scale up
  • CPU < 30% pendant 5min → Scale down

Coût estimé :

  • Kapsule : Gratuit (contrôle plane)
  • Nodes : 3x DEV1-M (4 vCPU, 8GB) = €0.024/h/node × 3 = ~€52/mois
  • Scale up jusqu’à 10 nodes lors des pics

C. Isolation des calculs : Docker-in-Docker (DinD)

Section intitulée « C. Isolation des calculs : Docker-in-Docker (DinD) »

Architecture de sécurité :

Worker Pod
└─ Celery Process
└─ Docker Container (task execution)
- CPU limits (cgroups)
- Memory limits (cgroups)
- Network isolation (no internet)
- Read-only filesystem (sauf /tmp)
- Timeout strict (kill après X min)

Validation pré-exécution :

  1. Analyse statique du code (Bandit, safety checks)
  2. Sandbox Python avec RestrictedPython
  3. Whitelist d’imports (numpy, scipy, etc.)
  4. Pas d’accès filesystem (sauf montage S3 read-only)

Tables principales :

-- Tasks metadata
CREATE TABLE tasks (
id UUID PRIMARY KEY,
user_id UUID NOT NULL,
name VARCHAR(255),
status ENUM('queued', 'running', 'completed', 'failed'),
priority INTEGER,
runtime_seconds INTEGER,
created_at TIMESTAMP,
started_at TIMESTAMP,
completed_at TIMESTAMP,
result_s3_key VARCHAR(512),
error_message TEXT
);
-- Workflows
CREATE TABLE workflows (
id UUID PRIMARY KEY,
user_id UUID NOT NULL,
name VARCHAR(255),
dag JSON, -- Graph de dépendances
status ENUM('draft', 'running', 'completed', 'failed')
);
-- Studies
CREATE TABLE studies (
id UUID PRIMARY KEY,
company_id UUID,
name VARCHAR(255),
workflows JSON[]
);

Coût : ~€18/mois pour PostgreSQL 1GB (Scaleway DB)


🏛️ ARCHITECTURE ALTERNATIVE (pour très gros volumes)

Section intitulée « 🏛️ ARCHITECTURE ALTERNATIVE (pour très gros volumes) »

Si vous dépassez 10 000 calculs/jour, considérer :

Option B : Scaleway Kubernetes + Serverless Containers

Section intitulée « Option B : Scaleway Kubernetes + Serverless Containers »
API FastAPI → Kubernetes Jobs (vs Workers permanents)
Chaque tâche = 1 Kubernetes Job éphémère
Auto-cleanup après exécution

Avantages :

  • ✅ Pas de workers idle (coût = 0 quand inactif)
  • ✅ Isolation parfaite (1 pod = 1 tâche)
  • ✅ Scale à l’infini (limité par quota Kapsule)

Inconvénients :

  • ❌ Overhead plus important (30s startup vs 1s avec Celery)
  • ❌ Plus complexe à monitorer

CritèreServerless FunctionsCelery + K8s WorkersK8s Jobs
Limite1000 functions∞ (limité par nodes)
Coût base€0 si inactif~€50/mois (3 workers)~€50/mois (nodes)
Coût à grande échelle€€€ (pay-per-invocation)€€ (nodes only)€€ (nodes only)
Latence démarrage~500ms~50ms (worker warm)~30s (pod spawn)
Isolation✅✅✅✅✅ (Docker)✅✅✅
Monitoring🟡 Fragmented✅ Flower + Grafana🟡 K8s dashboard
Complexité🟢 Simple🟡 Moyenne🔴 Complexe
Provider FR✅ Scaleway✅ Scaleway✅ Scaleway

  • Pourquoi : Simple, scalable, coût prévisible
  • Stack :
    • FastAPI (API) → Clever Cloud
    • Redis (queue) → Scaleway Managed Redis
    • Celery Workers → 3x VMs Scaleway (DEV1-M)
    • PostgreSQL → Scaleway DB
    • Object Storage → Scaleway S3
  • Coût estimé : ~€80/mois pour 1000 calculs/jour
  • Quand > 5000 calculs/jour
  • Déployer Celery workers dans Kapsule
  • Auto-scaling HPA
  • Coût optimisé (~€150/mois pour 10 000 calculs/jour)
  • Calculs courts (< 5s) → Serverless Containers (Scaleway)
  • Calculs longs → Kubernetes Workers
  • Meilleur rapport coût/performance

ServiceUsagePrix estimé
Kapsule (K8s)Worker orchestrationGratuit (control plane)
Instance DEV1-MWorker nodes (3x)€52/mois
Managed RedisTask queue€10/mois
Managed PostgreSQLMetadata€18/mois
Object StorageResults/inputs€0.01/GB (~€10/mois)
Load BalancerAPI HA€8/mois
Total~€98/mois

  1. Provisionner Redis Managed Database
  2. Configurer PostgreSQL avec schéma
  3. Déployer 3x VMs avec Docker + Celery
  1. Ajouter routes FastAPI pour task submission
  2. Intégrer Celery avec FastAPI
  3. Implémenter workers basiques (Python tasks)
  1. Isolation Docker-in-Docker
  2. Resource limits (CPU/RAM)
  3. Validation code statique
  1. Orchestration multi-tâches avec Celery Canvas
  2. DAG execution avec dépendances
  3. Retry logic et error handling
  1. Flower dashboard (Celery)
  2. Prometheus + Grafana (metrics)
  3. Alerting (PagerDuty/email)

  1. Pas de limite artificielle (1000 functions)
  2. Coût linéaire (scale selon usage)
  3. Provider français (RGPD-friendly)
  4. Tech mature (Celery = production-proven)
  5. Flexibilité (Python natif, facile à étendre)
  6. Isolation (Docker par tâche)
  7. Monitoring (Flower + Grafana)
  8. Support long-running (heures/jours)

Document généré le : 2025-09-30 Version : 1.0 Auteur : Architecture Team MecaPy