Files
roadwave/docs/adr/001-langage-backend.md
2026-01-31 11:45:11 +01:00

2.4 KiB

ADR-001 : Langage Backend

Statut : Accepté Date : 2025-01-17

Contexte

RoadWave doit gérer 10M d'utilisateurs avec des connexions concurrentes massives pour le streaming audio géolocalisé.

Décision

Go avec le framework Fiber.

Alternatives considérées

Comparatif synthétique

Option Conn/serveur P99 latency Simplicité Écosystème RoadWave
Go + Fiber 1M+ 5-50ms
Rust + Tokio 2M+ 2-20ms
Node.js 100-500K 10-100ms
Elixir/Phoenix 2M+ 5-50ms

Justification

Pourquoi Go plutôt que Rust ?

Rust offre meilleures performances absolues (2M conn/serveur vs 1M, 0 GC pauses) mais Go gagne sur le plan startup :

  1. Time-to-market critique : MVP en 8 semaines vs 12+ pour Rust

    • Courbe d'apprentissage borrow checker = grosse friction pour juniors
    • Temps compilation + refactoring : 30-60s vs 1-2s Go
    • Recrutement moins onéreux (€35-50K junior Go vs €50-70K Rust)
  2. Écosystème production-ready pour RoadWave :

    • WebRTC : pion/webrtc (mature) vs webrtc.rs (naissant)
    • Tests BDD : Godog/Gherkin natif en Go, pas d'équivalent Rust
    • PostgreSQL + PostGIS : pgx (excellent) vs sqlx (bon mais moins mature)
    • Zitadel/OAuth2 : clients Go stables vs Rust émergents
  3. Performance suffisante pour 10M users distribués :

    • 1M conn/serveur = 10 serveurs max pour pics
    • GC pauses (10-100ms) acceptable avec stratégie multi-région
    • Scaling horizontal plus simple que vertical
  4. Tooling natif :

    • pprof intégré (CPU, mémoire)
    • race detector systématique
    • Kubernetes first-class
    • Cold start ~10ms (vs ~50ms Rust)

Quand Rust aurait du sens

  • Si concentrations d'1M+ connexions sur serveur unique (cas rare RoadWave)
  • Si p99 latencies en prod > 100ms deviennent bottleneck (après Growth phase)
  • Si refonte majeure planifiée anyway
  • Stratégie possible : réécrire services hot (WebRTC, HLS streaming) en Rust à phase Scale

Conséquences

  • Formation équipe sur Go si nécessaire
  • Utilisation des bibliothèques : Fiber (HTTP), pgx (PostgreSQL), go-redis
  • Monitoring GC pauses en production (cibler < 20ms p95)
  • Potential migration partielle à Rust pour services critiques post-Series A