Server-Sent Events en Go : Applications web réactives sans WebSocket

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Server-Sent Events en Go : Quand WebSocket est excessif



Imaginez : vous écrivez un tableau de bord pour la surveillance de serveurs. Les données sont mises à jour toutes les 5 secondes. Le client doit recevoir des notifications en cas de baisse de charge. Que choisissez-vous ? WebSocket ? Long Polling ? Et si je vous disais qu'il existe une technologie qui fonctionne sur du HTTP standard, ne nécessite pas de bibliothèques supplémentaires côté client et est parfaitement adaptée à la transmission de données unidirectionnelle ?



Découvrez — Server-Sent Events (SSE). C'est un protocole intégré à HTML5 qui permet au serveur d'envoyer des données au client en temps réel via une seule connexion HTTP. Contrairement à WebSocket, SSE ne fonctionne que dans un sens — du serveur vers le client. Mais c'est précisément ce qui le rend idéal pour les notifications, les journaux, les cotations boursières et toutes les tâches où le serveur est la source de données et le client un auditeur passif.



Dans cet article, nous allons voir comment implémenter les Server-Sent Events en Go. Vous apprendrez à créer un streaming simple, à transmettre des événements personnalisés et à gérer les déconnexions des clients. C'est parti !



Pourquoi Go + SSE est puissant ?



Go est un langage conçu pour les applications réseau. Ses goroutines et ses canaux s'adaptent parfaitement au modèle SSE : chaque connexion est une goroutine distincte, et les canaux assurent un transfert sécurisé des données. De plus, Go est un langage compilé avec d'excellentes performances. Vous pouvez maintenir des dizaines de milliers de connexions SSE ouvertes sans consommation mémoire excessive.



L'avantage clé de SSE par rapport à WebSocket est la simplicité. Côté client, on utilise l'API standard EventSource, qui fonctionne dans tous les navigateurs modernes. Aucune bibliothèque supplémentaire, aucun framework. La partie serveur est un simple gestionnaire HTTP avec les bons en-têtes.



Quand utiliser SSE ?

  • Transmission unidirectionnelle — le serveur envoie des données, le client reçoit uniquement.
  • Notifications et alertes — système de surveillance, notifications push.
  • Streaming de données — journaux, cotations, tweets, actualités.
  • Reconnexion automatique — le navigateur rétablit lui-même la connexion en cas de rupture.


Fondamentaux du protocole Server-Sent Events



Avant d'écrire du code, comprenons comment SSE fonctionne au niveau HTTP. Lorsque le client ouvre une connexion, le serveur envoie des en-têtes spéciaux :



Content-Type: text/event-streamCache-Control: no-cacheConnection: keep-alive


Ensuite, le serveur envoie les données au format :



data: Message



Chaque message est séparé par deux sauts de ligne. On peut envoyer plusieurs champs :



event: userlogindata: {"username": "alice"}



Le champ event définit le type d'événement, et data son contenu (généralement du JSON). Il existe aussi les champs id (identifiant du dernier événement) et retry (temps de reconnexion en millisecondes).



Écrire un serveur SSE en Go



Commençons par le plus simple — un serveur qui envoie l'heure actuelle chaque seconde. Créez un fichier main.go :



package main

import ( "fmt" "net/http" "time")

func main() { http.HandleFunc("/events", sseHandler) http.ListenAndServe(":8080", nil)}

func sseHandler(w http.ResponseWriter, r *http.Request) { // Définir les en-têtes pour SSE w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive")

// Créer un flusher pour l'envoi immédiat des données flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "Streaming unsupported", http.StatusInternalServerError) return }

// Boucle infinie d'envoi d'événements for { select { case <-r.Con

Blogs

Book Recommendations