Verständnis von SSE (Server-Sent Events) und seine Vorteile
February 1, 2024
Einführung
SSE (Server-Sent Events) ist ein unidirektionales Kommunikationsprotokoll zwischen Clients und Servern, das auf dem HTTP-Protokoll basiert. Es ermöglicht Servern, Daten in Echtzeit über Ereignisströme an Clients zu senden, ohne dass explizite Anfragen von Clients erforderlich sind. Aufbauend auf dem standardmäßigen HTTP-Protokoll nutzt SSE unidirektionale persistente Verbindungen, wodurch Server aktiv Ereignisse und Daten an Clients senden können.
Im Wesentlichen wird es durch einen Streaming-Ansatz implementiert, bei dem der Client eine Verbindungsanfrage an den Server initiiert und die Verbindung offen hält. Der Server sendet dann aktiv Nachrichten an den Client. Die Daten, die vom Server an den Client mit Server-Sent Events (SSE) gesendet werden, müssen UTF-8-kodiert sein, und der zurückgegebene Inhaltstyp ist text/event-stream
. Zum Beispiel, wenn Sie ChatGPT verwenden und ihm eine Frage stellen, werden Sie sehen, wie es die Antwort Wort für Wort anzeigt. Tatsächlich sendet ChatGPT die vorberechneten Daten aktiv an Sie, wobei SSE-Technologie verwendet wird, um Daten während der Berechnung zurückzugeben, wodurch lange Wartezeiten vermieden werden, die dazu führen könnten, dass die Seite direkt geschlossen wird.
Vorteile von SSE
-
Echtzeit-Kommunikation: SSE bietet einen Echtzeit-Kommunikationsmechanismus, der es Servern ermöglicht, Daten aktiv an Clients zu senden. Diese Echtzeit-Fähigkeit macht SSE besonders geeignet für Anwendungen, die sofortige Aktualisierungen erfordern, wie Echtzeit-Chat, Online-Kollaborationstools, Echtzeit-Datenanzeige und Benachrichtigungsübermittlung.
-
Reduzierte Netzlast: Im Vergleich zu traditionellen Polling-Methoden nutzt SSE langlebige Verbindungen. Über eine einzige HTTP-Verbindung können Server mehrere Ereignisse an Clients senden, wodurch häufige HTTP-Anfragen vermieden und die Netzlast reduziert wird.
-
Leichtgewichtig: SSE basiert auf dem HTTP-Protokoll, wird von bestehender Server-Software unterstützt und ist einfacher zu verwenden als WebSocket.
-
Automatische Wiederherstellung der Verbindung: SSE kann automatisch versuchen, die Verbindung nach einem Abbruch wiederherzustellen, ohne dass zusätzlicher Code erforderlich ist. Dieser automatische Wiederherstellungsmechanismus erhöht die Systemstabilität und gewährleistet eine kontinuierliche Kommunikation auch bei instabilen Netzwerkbedingungen.
Proxying von SSE-Diensten mit API7 Enterprise
In praktischen Anwendungen trägt die Nutzung eines API-Gateways zum Proxying von SSE-Diensten dazu bei, die Dienststabilität zu erhöhen, Sicherheits- und Cross-Origin-Probleme zu lösen und ist geeignet für die Handhabung komplexer Anwendungsszenarien. NGINX, als einer der beliebtesten Reverse-Proxy-Server, hat einen beträchtlichen Marktanteil.
Beim Proxying von SSE-Diensten auf NGINX ist es notwendig, proxy_buffering
zu deaktivieren. Diese Konfiguration muss jedoch mindestens auf der Location-Ebene geschlossen werden, was bedeutet, dass, wenn es mehrere Locations im System gibt und nur einige das Caching deaktivieren müssen, um SSE-Dienste zu unterstützen, dies die Leistung anderer Nicht-SSE-APIs beeinträchtigen könnte. Darüber hinaus fehlt NGINX's proxy_buffering
-Konfiguration an Flexibilität, da sie nicht dynamisch zur Laufzeit aktiviert oder deaktiviert werden kann, sondern ein Neuladen der Konfiguration erfordert, was zu Dienstunterbrechungen führen kann.
API7 Enterprise bietet das proxy-buffering Plugin, das es Ihnen ermöglicht, SSE-Upstream-Dienste flexibler zu proxen. Durch Aktivieren dieses Plugins in den entsprechenden Routen können Sie das Caching einfach steuern, ohne das gesamte Konfigurations-Neuladen zu benötigen. Diese Flexibilität erfüllt die Anforderungen des SSE-Dienst-Proxying und berücksichtigt gleichzeitig Leistungs- und dynamische Konfigurationsbedürfnisse.
Tests wie unten bestätigen das erfolgreiche Proxying von SSE-Diensten.
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
...
Fazit
Zusammenfassend ist SSE geeignet für Szenarien, die Echtzeit-Kommunikation und -Aktualisierungen erfordern, und bietet eine einfache und effektive Möglichkeit, dies zu erreichen. Es ist jedoch wichtig zu beachten, dass SSE ein unidirektionaler Kanal ist, der es nur Servern ermöglicht, Nachrichten an Clients zu senden. Daher ist SSE möglicherweise nicht für alle Arten von Echtzeit-Kommunikationsbedürfnissen geeignet. Für komplexere bidirektionale Kommunikationsszenarien könnten WebSocket oder andere Technologien besser geeignet sein.