Comprendre SSE (Server-Sent Events) et ses avantages
February 1, 2024
Introduction
SSE (Server-Sent Events) est un protocole de communication unidirectionnel entre les clients et les serveurs basé sur le protocole HTTP. Il permet aux serveurs de pousser des données aux clients en temps réel en utilisant des flux d'événements sans nécessiter de requêtes explicites de la part des clients. Construit sur le protocole HTTP standard, SSE utilise des connexions persistantes unidirectionnelles, permettant aux serveurs d'envoyer activement des événements et des données aux clients.
En essence, il est mis en œuvre en utilisant une approche de streaming, où le client initie une demande de connexion au serveur et maintient la connexion ouverte. Le serveur pousse ensuite activement des messages au client. Les données envoyées du serveur au client via Server-Sent Events (SSE) doivent être encodées en UTF-8, et le type de contenu retourné est text/event-stream
. Par exemple, lorsque vous utilisez ChatGPT, lorsque vous lui posez une question, vous verrez qu'il affiche la réponse mot par mot. En réalité, ChatGPT pousse activement les données pré-calculées vers vous, en utilisant la technologie SSE pour retourner des données tout en calculant, évitant ainsi les longs temps d'attente de l'interface qui pourraient conduire à la fermeture directe de la page.
Avantages de SSE
-
Communication en Temps Réel : SSE offre un mécanisme de communication en temps réel, permettant aux serveurs de pousser activement des données aux clients. Cette capacité en temps réel rend SSE particulièrement adapté aux applications nécessitant des mises à jour immédiates, telles que le chat en temps réel, les outils de collaboration en ligne, l'affichage de données en temps réel et la livraison de notifications.
-
Réduction de la Charge Réseau : Par rapport aux méthodes traditionnelles de polling, SSE utilise des connexions de longue durée. Grâce à une seule connexion HTTP, les serveurs peuvent pousser plusieurs événements aux clients, évitant ainsi les requêtes HTTP fréquentes et réduisant la charge réseau.
-
Léger : SSE est basé sur le protocole HTTP, supporté par les logiciels serveurs existants, et plus simple à utiliser comparé à WebSocket.
-
Reconnexion Automatique : SSE peut tenter automatiquement de se reconnecter après une interruption de connexion sans nécessiter de code supplémentaire. Ce mécanisme de reconnexion automatique améliore la stabilité du système, assurant une communication continue même dans des conditions de réseau instables.
Proxying des Services SSE avec API7 Enterprise
Dans les applications pratiques, l'utilisation d'une passerelle API pour proxier les services SSE contribue à améliorer la stabilité du service, à résoudre les problèmes de sécurité et de cross-origin, et est adaptée pour gérer des scénarios d'application complexes. NGINX, étant l'un des serveurs de proxy inverse les plus populaires, détient une part de marché considérable.
Lors du proxying des services SSE sur NGINX, il est nécessaire de désactiver proxy_buffering
. Cependant, cette configuration doit être fermée au moins au niveau de l'emplacement, ce qui implique que s'il y a plusieurs emplacements dans le système et que seuls quelques-uns ont besoin de désactiver la mise en cache pour supporter les services SSE, cela pourrait affecter les performances des autres API non-SSE. De plus, la configuration proxy_buffering
de NGINX manque de flexibilité car elle ne peut pas être activée ou désactivée dynamiquement au moment de l'exécution, nécessitant un rechargement de la configuration pour prendre effet, ce qui peut entraîner une interruption de service.
API7 Enterprise fournit le plugin proxy-buffering, vous permettant de proxier plus flexiblement les services SSE en amont. En activant ce plugin dans les routes correspondantes, vous pouvez facilement contrôler la mise en cache sans avoir à recharger toute la configuration. Cette flexibilité répond aux exigences du proxying des services SSE tout en répondant aux besoins de performance et de configuration dynamique.
Le test ci-dessous confirme le proxying réussi des services SSE.
curl "http://127.0.0.1:9080/.sse" -H "Accept: text/event-stream"
event: server
data: 27d365b177ae
id: 1
event: request
data: GET /.sse HTTP/1.1
data:
data: Host: 127.0.0.1:9080
data: Accept: text/event-stream
data: User-Agent: curl/8.1.2
data: X-Forwarded-For: 192.168.65.1
data: X-Forwarded-Host: 127.0.0.1
data: X-Forwarded-Port: 9080
data: X-Forwarded-Proto: http
data: X-Real-Ip: 192.168.65.1
data:
id: 2
event: time
data: 2024-01-29T04:04:20Z
id: 3
event: time
data: 2024-01-29T04:04:21Z
id: 4
...
Conclusion
En résumé, SSE est adapté aux scénarios nécessitant une communication et des mises à jour en temps réel, fournissant un moyen simple et efficace pour y parvenir. Cependant, il est important de noter que SSE est un canal unidirectionnel, permettant uniquement aux serveurs d'envoyer des messages aux clients. Par conséquent, SSE peut ne pas être adapté à tous les types de besoins de communication en temps réel. Pour des scénarios de communication bidirectionnelle plus complexes, WebSocket ou d'autres technologies peuvent être plus appropriées.