Server-Sent Events in Go: Wenn WebSocket übertrieben ist
Stellen Sie sich vor: Sie schreiben ein Dashboard zur Serverüberwachung. Die Daten werden alle 5 Sekunden aktualisiert. Der Client soll Benachrichtigungen über Lastabfälle erhalten. Was wählen Sie? WebSocket? Long Polling? Was, wenn ich Ihnen sage, dass es eine Technologie gibt, die über normales HTTP funktioniert, keine zusätzlichen Bibliotheken auf dem Client benötigt und sich ideal für unidirektionale Datenübertragung eignet?
Lernen Sie Server-Sent Events (SSE) kennen. Dies ist ein in HTML5 integriertes Protokoll, das es dem Server ermöglicht, Daten in Echtzeit über eine einzige HTTP-Verbindung an den Client zu senden. Im Gegensatz zu WebSocket funktioniert SSE nur in eine Richtung – vom Server zum Client. Aber genau das macht es ideal für Benachrichtigungen, Logs, Aktienkurse und alle Aufgaben, bei denen der Server die Datenquelle und der Client ein passiver Zuhörer ist.
In diesem Artikel werden wir uns ansehen, wie man Server-Sent Events in Go implementiert. Sie erfahren, wie Sie einfaches Streaming erstellen, benutzerdefinierte Events senden und Client-Trennungen behandeln. Los geht's!
Warum Go + SSE leistungsstark ist?
Go ist eine Sprache, die für Netzwerkanwendungen entwickelt wurde. Seine Goroutinen und Kanäle passen perfekt zum SSE-Modell: Jede Verbindung ist eine eigene Goroutine, und Kanäle gewährleisten eine sichere Datenübertragung. Außerdem ist Go eine kompilierte Sprache mit hervorragender Leistung. Sie können Zehntausende offener SSE-Verbindungen ohne großen Speicherverbrauch aufrechterhalten.
Der Hauptvorteil von SSE gegenüber WebSocket ist die Einfachheit. Auf der Client-Seite wird die normale EventSource-API verwendet, die in allen modernen Browsern funktioniert. Keine zusätzlichen Bibliotheken, keine Frameworks. Der Server-Teil ist ein normaler HTTP-Handler mit den richtigen Headern.
Wann sollte man SSE verwenden?
- Unidirektionale Übertragung – der Server sendet Daten, der Client empfängt nur.
- Benachrichtigungen und Alarme – Überwachungssysteme, Push-Benachrichtigungen.
- Daten-Streaming – Logs, Aktienkurse, Tweets, Nachrichten.
- Automatische Wiederverbindung – der Browser stellt die Verbindung bei Unterbrechung selbst wieder her.
Grundlagen des Server-Sent Events-Protokolls
Bevor wir Code schreiben, lassen Sie uns verstehen, wie SSE auf HTTP-Ebene funktioniert. Wenn der Client eine Verbindung öffnet, sendet der Server spezielle Header:
Content-Type: text/event-streamCache-Control: no-cacheConnection: keep-aliveDanach sendet der Server Daten im Format:
data: Nachricht
Jede Nachricht wird durch zwei Zeilenumbrüche getrennt. Sie können mehrere Felder senden:
event: userlogindata: {"username": "alice"}
Das Feld event definiert den Ereignistyp, und data seinen Inhalt (normalerweise JSON). Es gibt auch die Felder id (Kennung des letzten Ereignisses) und retry (Wiederverbindungszeit in Millisekunden).
SSE-Server in Go schreiben
Beginnen wir mit dem Einfachsten – einem Server, der jede Sekunde die aktuelle Uhrzeit sendet. Erstellen Sie eine Datei 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) { // Header für SSE setzen w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive")
// Flusher für sofortigen Datenversand erstellen flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "Streaming unsupported", http.StatusInternalServerError) return }
// Endlosschleife zum Senden von Ereignissen for { select { case <-r.Con