Développement15 juillet 2026· via DEV Community

Quand les flux SSE se brisent : le piège réseau caché des apps IA

Quand les flux SSE se brisent : le piège réseau caché des apps IA

Image : DEV Community

Il était 23:14 quand l’alarme a retenti : CareerPilot AI avait gelé, tourné pendant 30 secondes avant de disparaître. Un coup d’œil rapide via DevTools a révélé la cause—ERR_INCOMPLETE_CHUNKED_ENCODING—juste après une requête GET vers /api/analyze-career. Le problème ne venait pas de la logique du code, mais de la fragmentation invisible des paquets TCP, révélée seulement après le passage de l’app du localhost à Google Cloud Run.

L’illusion du streaming qui fonctionnait en local

CareerPilot AI exécute un pipeline agentique en six étapes, diffusant en temps réel les raisonnements intermédiaires via des événements serveurs (SSE). Plutôt que de bloquer les utilisateurs sur un écran vide de 20 secondes pendant que Gemini traite, l’interface s’illumine avec des commentaires de mentor en direct. Chaque étape écrit un fragment JSON dans le canal SSE, aboutissant à une charge utile finale de 15 Ko contenant compétences, références et un calendrier sur 30 jours. En local, le pipeline était parfait—chaque fragment arrivait intact, chaque objet JSON complet.

Le proxy qui a brisé le flux

Le déploiement a révélé une bombe à retardement : le frontal Google (GFE) se place entre l’app et Internet. En local, les paquets TCP circulent sans entrave ; derrière le GFE, la charge utile JSON finale, plus volumineuse, était découpée à mi-octet selon des frontières de paquets réseau arbitraires. Le client, attendant des objets JSON entièrement formés par fragment, a reçu des morceaux mutilés comme {"finalResult":{"skills":[{"name":"Python",. Le parseur SSE du navigateur a calé, la connexion s’est figée, et l’app a planté.

La « correction » qui n’en était pas une

Le premier réflexe a été de forcer le vidage après chaque fragment pour éviter les retards de mise en mémoire tampon. Ce changement a empiré la situation : les vidages agressifs ont poussé de minuscules chaînes dans des frontières de paquets TCP arbitraires, fragmentant davantage la charge utile finale. La vraie solution est venue d’un recul—laisser la couche de streaming gérer naturellement la mémoire tampon et s’assurer que le client gère les charges partielles avec élégance.

Pourquoi c’est important

Cet incident met en lumière comment des couches réseau invisibles peuvent saboter les apps IA en temps réel reposant sur un streaming fin. Un rappel que les SSE ne sont pas qu’une commodité frontale—ils constituent un contrat TCP entre serveur et client. Les équipes déployant des fonctionnalités agentiques ou basées sur des LLM derrière des proxys mondiaux doivent valider les frontières des fragments, les politiques de mémoire tampon et la résilience des parseurs à grande échelle. Sinon, les utilisateurs subissent non pas un ralentissement, mais un échec total déguisé en hoquet de streaming.


Source : DEV Community. Synthèse éditoriale assistée par IA — TechnoExpress.

Lire la source originale sur DEV Community →

← Retour à l'accueil