Nichtflüchtige Verbindungen mit WebSockets erstellen

Sie können WebSockets verwenden, um eine persistente Verbindung von einem Client (z. B. einem mobilen Gerät oder einem Computer) zu einer App Engine-Instanz herzustellen. Die offene Verbindung ermöglicht jederzeit den bidirektionalen Datenaustausch zwischen Client und Server, was zu geringeren Latenzzeiten und einer besseren Ressourcenauslastung führt.

WebSockets

Das in RFC 6455 definierte WebSocket-Protokoll bietet einen Vollduplex-Kommunikationskanal zwischen einem Client und einem Server. Der Kanal wird über eine HTTP(S)-Anfrage mit einem „Upgrade“-Header initiiert.

Typische Anwendungsbeispiele für WebSockets sind:

  • Aktualisierungen von Ereignissen in Echtzeit, z. B. Social-Media-Feeds, Sportergebnisse, Nachrichten oder Börsenkurse
  • Nutzerbenachrichtigungen wie zu Software- oder Inhaltsaktualisierungen
  • Chat-Anwendungen
  • Tools zur kollaborativen Bearbeitung
  • Spiele mit Mehrspielermodus

WebSockets stehen Ihrer Anwendung jederzeit zur Verfügung, ohne dass eine Einrichtung notwendig ist. Nach dem Verbindungsaufbau wird eine WebSockets-Verbindung nach einer Stunde mit einer Zeitüberschreitung beendet. Die Nutzung des WebSockets wird nach der Verbindungsnutzung abgerechnet bis zur Zeitüberschreitung oder zur Socket-Beendigung.

Beispielanwendung mit WebSockets ausführen

Voraussetzungen und Einrichtung

Die Codebeispiele in diesem Dokument beschreiben die Ausführung einer Beispielanwendung mit WebSockets für die Java-Laufzeitversion 8 und Version 11/17. Beachten Sie, dass Sie app.yaml aktualisieren müssen, um die neue Version zu verwenden. Weitere Informationen zur Verwendung der neuen Laufzeiten finden Sie unter Java-Laufzeit.

Folgen Sie der Anleitung unter Entwicklungsumgebung einrichten , um Ihre Umgebung und Ihr Projekt einzurichten und mehr über die Strukturierung von Anwendungen zu erfahren.

Beispielanwendung klonen

Kopieren Sie die Beispielanwendungen auf Ihren lokalen Computer und rufen Sie das Verzeichnis websockets auf:

Version 1

  git clone https://github.com/GoogleCloudPlatform/java-docs-samples
  cd java-docs-samples/flexible/java-11/websocket-jetty/

Version 8

  git clone https://github.com/GoogleCloudPlatform/java-docs-samples
  cd java-docs-samples/flexible/java-8/websocket-jetty/

Beispiel lokal ausführen

So führen Sie die Beispielanwendung auf Ihrem lokalen Computer aus:

  1. Starten Sie den lokalen Jetty-Webserver mit dem Jetty Maven-Plug-in:

    mvn jetty:run-exploded
    
  2. Geben Sie im Webbrowser die folgende Adresse ein:

    http://localhost:8080
    

Beispiel in App Engine bereitstellen und ausführen

Führen Sie den folgenden Befehl im Verzeichnis websocket-jetty aus, um Ihre Anwendung in der flexiblen Umgebung von App Engine bereitzustellen:

mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID

Ersetzen Sie PROJECT_ID durch die ID Ihres Google Cloud-Projekts. Wenn in der Datei pom.xml bereits Ihre Projekt-ID angegeben ist, müssen Sie das Attribut -Dapp.deploy.projectId nicht in dem von Ihnen ausgeführten Befehl einfügen.

Die Beispielanwendung ist als JAR-Paket verpackt und wird automatisch mit der Laufzeit Java 8/Jetty 9 mit Servlet 3.1 ausgeführt.

Sie können Ihren Browser dann an https://PROJECT_ID.REGION_ID.r.appspot.com weiterleiten.

Rufen Sie https://PROJECT_ID.REGION_ID.r.appspot.com/js_client.jsp auf, um den JavaScript-Client zu testen.

Sitzungsaffinität

Nicht alle Clients unterstützen WebSockets. Zur Umgehung dieses Problems verwenden viele Anwendungen Bibliotheken wie socket.io. Diese greifen bei Clients, die WebSockets nicht unterstützen, auf HTTP-Long-Polling-Anfragen zurück.

App Engine verteilt Anfragen normalerweise gleichmäßig auf die verfügbaren Instanzen. Bei der Verwendung von HTTP-Long-Polling-Anfragen müssen jedoch mehrere sequenzielle Anfragen eines bestimmten Nutzers dieselbe Instanz erreichen.

Damit App Engine Anfragen desselben Nutzers an dieselbe Instanz schicken kann, können Sie die Sitzungsaffinität aktivieren. App Engine identifiziert dann mithilfe eines Cookies, welche Anfragen von jeweils demselben Nutzer gesendet werden, und leitet diese Anfragen an dieselbe Instanz weiter.

Die Sitzungsaffinität in App Engine ist auf Best-Effort-Basis implementiert. Bei der Entwicklung Ihrer Anwendung sollten Sie immer davon ausgehen, dass die Sitzungsaffinität nicht garantiert ist. In den folgenden Fällen kann ein Client die Affinität zur Zielinstanz verlieren:

  • Das App Engine-Autoscaling kann Instanzen hinzufügen oder entfernen, die Sie für Ihre Anwendung benötigen. Die Anwendung kann die Last neu zuordnen und die Zielinstanz wird möglicherweise verschoben. Damit dieses Risiko minimiert wird, legen Sie die Mindestanzahl der Instanzen fest, mit denen die erwartete Last verarbeitet werden soll.
  • Wenn bei Systemdiagnosen in der Zielinstanz Fehler gefunden werden, verschiebt App Engine die Sitzung in eine fehlerfreie Instanz. Weitere Informationen zu Systemdiagnosen und ihren Anpassungsoptionen finden Sie unter Geteilte Systemdiagnosen.
  • Die Sitzungsaffinität geht verloren, wenn eine Instanz wegen Wartungs- oder Softwareupdates neu gestartet wird. VM-Instanzen der flexiblen App Engine-Umgebung werden wöchentlich neu gestartet.

Die Sitzungsaffinität kann nicht garantiert werden. Darum sollten Sie sie nur verwenden, um die Fähigkeit von socket.io und anderen Bibliotheken zu nutzen, bei Verbindungsabbrüchen auf HTTP-Long-Abfragen zurückzugreifen. Sie sollten Sitzungsaffinität niemals dazu verwenden, zustandsorientierte Anwendungen zu erstellen.

Sitzungsaffinität aktivieren und deaktivieren

Die Sitzungsaffinität ist standardmäßig für alle App Engine-Anwendungen deaktiviert. Die Sitzungsaffinität wird auf Versionsebene Ihrer Anwendung festgelegt und kann bei der Bereitstellung aktiviert oder deaktiviert werden.

Fügen Sie der Datei app.yaml den folgenden Eintrag hinzu, um die Sitzungsaffinität für Ihre App Engine-Version zu aktivieren:

network:
  session_affinity: true

Sobald die Version mit der aktualisierten Datei app.yaml bereitgestellt ist, werden neue Anfragen so lange von derselben Instanz ausgeführt, wie diese Instanz verfügbar ist.

Entfernen Sie zum Deaktivieren der Sitzungsaffinität den Eintrag aus der Datei app.yaml oder legen Sie als Wert „false“ fest:

network:
  session_affinity: false