Aller au contenu principal

ADR-058 : Intégration Pingora — Pool de Connexions Embarqué

Métadonnées

ChampValeur
StatutAccepté
Date2026-03-16
DécideursChristophe Aboulicam
LiensADR-024 (Modes Gateway), CAB-1847, CAB-1849

Contexte

Pingora de Cloudflare (Rust, Apache 2.0) a remplacé nginx et traite plus de 1 000 milliards de requêtes par jour. STOA Gateway est construit sur axum + reqwest + tokio. La question : comment STOA doit-elle tirer parti de Pingora ?

Pourquoi Pingora

L'Argument Commercial (facteur décisif)

Signalaxum seulAvec Pingora
Argumentaire enterprise« Gateway Rust custom »« Construit sur Pingora — le framework proxy de Cloudflare »
Positionnement concurrentielMême niveau que les proxies customMême niveau que Cloudflare Workers, Fastly Compute
Case CISOStack inconnueBattle-tested à 1T+ req/jour
Crédibilité open sourceFramework génériquePedigree infrastructure-grade
Unicité marchéAucuneSeule API gateway construite sur Pingora

Aucun éditeur d'API gateway — Kong, Gravitee, Envoy, agentgateway — n'utilise Pingora. Il s'agit d'un avantage de premier entrant en termes de positionnement.

L'Argument Technique

Fonctionnalitéreqwest (actuel)Pingora Connector
Pool de connexionsPar instance clientPartagé entre tous les workers (avantage clé de Cloudflare)
Multiplexage H2Par connexionMultiplexage de flux global
Réutilisation du pool à l'échelleSe dégrade au-delà de 10K RPSConçu pour 1T+ req/jour
Proxy zero-copyNon (copie userspace)Kernel splice/sendfile (futur)

En dessous de 1K RPS, la différence est de 0,5 ms p95. Au-delà de 50K RPS, le pooling partagé évite l'épuisement des connexions que les pools par client atteignent.

Options Évaluées

OptionDescriptionEffortVerdict
A : Migration complèteRemplacer axum par le serveur Pingora55+ ptsRejeté — réécrit 400+ routes
B : SidecarPingora front-proxy → stoa-gateway21 ptsRejeté — saut supplémentaire, valeur faible
C : EmbarquéConnecteur Pingora intégré dans stoa-gateway13 ptsAccepté
D : Patterns uniquementCopier les patterns Pingora sans utiliser le crate0 ptsSupplanté par C

Pourquoi l'Option Embarquée (Option C) a Été Retenue

  • Un seul binaire — pas de sidecar, pas de saut supplémentaire, pas de complexité de déploiement
  • Même argument marketing — « Construit sur Pingora » est tout aussi vrai pour un connecteur embarqué
  • Valeur réelle — le pool partagé de Pingora est l'avantage Cloudflare concret, pas le serveur
  • Feature-gated--features pingora l'active ; le build par défaut conserve reqwest (sans dépendance cmake)
  • Incrémental — le chemin proxy migre vers PingoraPool progressivement ; MCP/admin/auth restent sur axum sans modification

Décision

Embarquer pingora-core::connectors::http::Connector dans stoa-gateway derrière un feature flag pingora.

Architecture

Client → stoa-gateway (:8080)

├─ MCP / admin / auth / OAuth → axum handlers (unchanged)

└─ Proxy routes → PingoraPool.send_request()

└─ pingora-core shared connection pool
→ Backend (H1/H2, TLS, keepalive)

Un seul binaire. Un seul port. Un seul déploiement. Pingora gère les connexions upstream ; axum gère le routage HTTP.

Implémentation

PRContenu
#1799Binaire standalone stoa-pingora/ (POC sidecar — supplanté)
#1801PingoraPool embarqué dans stoa-gateway (chemin de production)
#1803CI/CD : FEATURES=kafka,pingora dans le build Docker

Compatibilité des Phases

Notre trait ProxyPhase est mappé 1:1 avec ProxyHttp de Pingora :

STOA ProxyPhasePingora ProxyHttpStatut
request_filterrequest_filterCorrespondance
upstream_selectupstream_peerCorrespondance
upstream_request_filterupstream_request_filterCorrespondance
response_filterupstream_response_filterCorrespondance
loggingloggingCorrespondance
error_handlererror_while_proxyCorrespondance

Si une migration complète vers Pingora s'avère nécessaire à la v2.0, les implémentations de phases sont portables directement.

Ce que STOA Possède que Pingora n'a Pas

CapacitéSTOAPingora
Analyse HTTP eBPF au niveau kernelProgrammes XDP + TCNon intégré
Enforcement des politiques UAC au niveau kernelBPF maps synchronisées depuis la gatewayNon intégré
Runtime de plugins WASMIntégration wasmtimeNon intégré
Protocole MCP (gateway pour agents IA)SSE/WS/JSON-RPC completNon applicable
Fédération multi-gateway7 types d'adaptateursNon applicable

STOA utilise Pingora pour ce qu'il fait de mieux (pooling de connexions) et y ajoute des couches que Pingora n'offre pas.

Conséquences

  • L'image de production est construite avec FEATURES=kafka,pingora (cmake requis dans Docker)
  • PingoraPool est disponible pour le chemin proxy ; reqwest demeure en solution de repli
  • Le build par défaut (sans features) fonctionne toujours sans dépendance cmake
  • Marketing : « STOA Gateway — propulsé par le moteur de connexions Pingora »
  • Le fichier NOTICE inclut l'attribution Apache 2.0 de Pingora
  • Réévaluer une migration complète à la v2.0 ou au-delà de 50K RPS