Node, Go, Rust, PHP : une même API, quatre runtimes, des chiffres
La questionÀ partir de quel niveau de charge le choix du runtime devient-il le facteur limitant d’une API métier classique ?
Sur une API avec base de données, l’écart entre runtimes est de 1 à 4 en débit brut, mais la base sature bien avant. Le runtime ne devient le goulot qu’au-delà de 3 000 requêtes par seconde par instance, un seuil que la plupart de nos clients n’approchent pas.
DécisionStack PHP 8.3 et Node conservées comme socle. Go retenu pour les workers à forte concurrence. Rust écarté pour le développement métier.
- Statut
- Concluant
- Durée
- 3 semaines
- Équipe
- 3 développeurs, 1 architecte
- Stack
- Node 22
- Go 1.23
- Rust (Axum)
- PHP 8.3
- FrankenPHP
- Postgres
- k6
Contexte
Ce qu’on a testé
- Node 22 avec Fastify.
- Go 1.23 avec la bibliothèque standard et pgx.
- Rust avec Axum et sqlx.
- PHP 8.3 avec Symfony, servi par FrankenPHP en mode worker.
Résultats
38 400
req/s · Rust · sans base
31 200
req/s · Go · sans base
12 900
req/s · Node · sans base
9 800
req/s · PHP · sans base
- FrankenPHP en mode worker change la donne pour PHP : trois fois plus de débit qu’en PHP-FPM classique sur le même code, sans modification applicative.
- Temps de développement : PHP 11 h, Node 13 h, Go 19 h, Rust 35 h pour le même périmètre, tests inclus. Rust a demandé deux relectures de plus pour être considéré comme propre.
- Sous 1 000 requêtes par seconde, aucun runtime n’est distinguable d’un autre sur la latence perçue.
- Go se démarque sur les tâches de fond à forte concurrence (export, traitement par lots) : 40 Mo de mémoire et un modèle de concurrence simple à relire.
Ce qu’on en conclut
Et maintenant
- FrankenPHP est devenu notre configuration recommandée pour les nouveaux projets PHP et les migrations depuis PHP-FPM.
- Go est notre choix par défaut pour les workers de traitement (exports, files d’attente, intégrations) quand le volume le justifie.
- Les demandes de réécriture pour cause de performance passent désormais par un profilage préalable, avec ce banc comme référence.