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 bis zur Beendigung des Zeitlimits oder der Socket-Beendigung nach der Verbindungsnutzung abgerechnet.

Beispielanwendung mit WebSockets ausführen

Voraussetzungen und Einrichtung

Die Codebeispiele in diesem Dokument beschreiben die Ausführung einer Beispielanwendung mit Anwendung mit WebSockets für Python Laufzeitversion 3.7 und niedriger. Weitere Informationen zur Verwendung neuerer Versionen für Python Version 3.8 und höher finden Sie unter Python-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:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible_python37_and_earlier/websockets/

Beispiel lokal ausführen

Sie müssen Gunicorn mit dem Worker flask_socket verwenden, um es lokal auszuführen:

$ gunicorn -b 127.0.0.1:8080 -k flask_sockets.worker main:app

Beispiel in App Engine bereitstellen und ausführen

Sie führen den folgenden Befehl in dem Verzeichnis aus, in dem sich die Datei app.yaml befindet, um Ihre Anwendung in der flexiblen App Engine-Umgebung bereitzustellen:

gcloud app deploy

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

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