Persistente Verbindungen mit WebSockets erstellen

Regions-ID

REGION_ID ist ein abgekürzter Code, den Google anhand der Region zuweist, die Sie beim Erstellen Ihrer Anwendung ausgewählt haben. Der Code bezieht sich nicht auf ein Land oder eine Provinz, auch wenn einige Regions-IDs häufig verwendeten Länder- und Provinzcodes ähneln können. Das Einbinden von REGION_ID.r in App Engine-URLs ist für vorhandene Anwendungen optional und wird bald für alle neuen Anwendungen erforderlich sein.

Für einen reibungslosen Übergang wird App Engine nach und nach für die Verwendung von Regions-IDs aktualisiert. Wenn Ihr Google Cloud-Projekt noch nicht aktualisiert wurde, wird für Ihre Anwendung keine Regions-ID angezeigt. Da die ID für vorhandene Anwendungen optional ist, müssen Sie keine URLs aktualisieren oder andere Änderungen vornehmen, wenn die Regions-ID für Ihre vorhandenen Anwendungen verfügbar wird.

Hier finden Sie weitere Informationen zu Regions-IDs.

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.

Beispielanwendung mit WebSockets ausführen

Folgen Sie zunächst der Anleitung unter "Hello, World!" für Java in App Engine, um Ihre Umgebung und Ihr Projekt einzurichten. Darin erfahren Sie auch mehr über die Strukturierung von Java-Anwendungen in App Engine.

Beispielanwendung klonen

Die Beispielanwendungen kopieren Sie auf Ihren lokalen Computer und rufen das Verzeichnis websockets auf:

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/flexible/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 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