In dieser Anleitung erfahren Sie, wie Sie einen Multiroom-Echtzeit-Chatdienst mithilfe von WebSockets mit einer persistenten Verbindung für bidirektionale Kommunikation erstellen. Mit WebSockets können sowohl der Client als auch der Server Nachrichten gegenseitig übertragen, ohne den Server nach Updates abzufragen.
Sie können Cloud Run zwar für die Verwendung der Sitzungsaffinität konfigurieren, dies bietet jedoch eine Best-Effort-Affinität. Dies bedeutet, dass jede neue Anfrage trotzdem möglicherweise an eine andere Instanz weitergeleitet wird. Nutzernachrichten müssen daher im Chatdienst über alle Instanzen hinweg synchronisiert werden, und nicht nur zwischen den Clients, die mit einer Instanz verbunden sind.
Designübersicht
Dieser Beispiel-Chatdienst verwendet eine Memorystore for Redis-Instanz, um Nutzernachrichten in allen Instanzen zu speichern und zu synchronisieren. Redis verwendet einen Pub/Sub-Mechanismus, der nicht mit dem Produkt Cloud Pub/Sub verwechselt werden sollte, um Daten an abonnierte Clients zu senden, die mit einer Instanz verbunden sind, um HTTP-Abfragen zu vermeiden.
Selbst bei Push-Updates erhält jede hochgefahrene Instanz nur neue Nachrichten an den Container. Zum Laden vorheriger Nachrichten muss der Nachrichtenverlauf gespeichert und aus einer nichtflüchtigen Speicherlösung abgerufen werden. In diesem Beispiel werden die konventionellen Funktionen eines Objektspeichers von Redis zum Zwischenspeichern und Abrufen des Nachrichtenverlaufs verwendet.
Die Redis-Instanz ist über private IP-Adressen mit Zugriffssteuerung geschützt und auf Dienste beschränkt, die im selben virtuellen privaten Netzwerk wie die Redis-Instanz ausgeführt werden. Daher ist ein Connector für serverlosen VPC-Zugriff erforderlich, damit der Cloud Run-Dienst eine Verbindung zu Redis herstellen kann. Weitere Informationen zum Serverlosen VPC-Zugriff.
Beschränkungen
In dieser Anleitung wird weder auf Endnutzerauthentifizierungs- oder Sitzungs-Caching eingegangen. Weitere Informationen zur Endnutzerauthentifizierung finden Sie in der Cloud Run-Anleitung zur Endnutzerauthentifizierung.
In dieser Anleitung wird keine Datenbank wie Firestore zum unbefristeten Speichern und Abrufen des Chat-Nachrichtenverlaufs implementiert.
Für diesen produktionsbereiten Dienst sind zusätzliche Elemente erforderlich. Für die Bereitstellung von Hochverfügbarkeit mit Replikation und automatischem Failover wird eine Redis-Instanz der Standardstufe empfohlen.
Ziele
Schreiben, Erstellen und Bereitstellen eines Cloud Run-Dienstes, der WebSockets verwendet.
Stellen Sie eine Verbindung zu einer Memorystore for Redis-Instanz her, um neue Nachrichten auf Instanzen zu veröffentlichen und zu abonnieren.
Verbinden Sie den Cloud Run-Dienst mit Memorystore über Connectors für den serverlosen VPC-Zugriff.
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Hinweise
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Memorystore for Redis, Serverless VPC Access, Artifact Registry, and Cloud Build APIs.
- Installieren und initialisieren Sie die gcloud CLI.
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Ausführen der Anleitung benötigen:
-
Artifact Registry-Leser (
roles/artifactregistry.reader
) -
Cloud Build-Bearbeiter (
roles/cloudbuild.builds.editor
) -
Cloud Memorystore Redis-Administrator (
roles/redis.admin
) -
Cloud Run-Administrator (
roles/run.admin
) -
Create Service Accounts (
roles/iam.serviceAccountCreator
) -
Projekt-IAM-Administrator (
roles/resourcemanager.projectIamAdmin
) -
Dienstagent für serverlosen VPC-Zugriff (
roles/vpcaccess.serviceAgent
) -
Service Account Admin (
roles/iam.serviceAccountAdmin
) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer
)
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.
Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.
gcloud
-Standardeinstellungen einrichten
So konfigurieren Sie gcloud mit Standardeinstellungen für den Cloud Run-Dienst:
Legen Sie ein Standardprojekt fest:
gcloud config set project PROJECT_ID
Ersetzen Sie PROJECT_ID durch den Namen des Projekts, das Sie für diese Anleitung erstellt haben.
Konfigurieren Sie gcloud für die von Ihnen ausgewählte Region:
gcloud config set run/region REGION
Ersetzen Sie REGION durch die unterstützte Cloud Run-Region Ihrer Wahl.
Cloud Run-Standorte
Cloud Run ist regional. Die Infrastruktur, in der die Cloud Run-Dienste ausgeführt werden, befindet sich demnach in einer bestimmten Region. Aufgrund der Verwaltung durch Google sind die Anwendungen in allen Zonen innerhalb dieser Region redundant verfügbar.
Bei der Auswahl der Region, in der Ihre Cloud Run-Dienste ausgeführt werden, ist vorrangig, dass die Anforderungen hinsichtlich Latenz, Verfügbarkeit oder Langlebigkeit erfüllt werden.
Sie können im Allgemeinen die Region auswählen, die Ihren Nutzern am nächsten liegt, aber Sie sollten den Standort der anderen Google Cloud-Produkte berücksichtigen, die von Ihrem Cloud Run-Dienst verwendet werden.
Die gemeinsame Nutzung von Google Cloud-Produkten an mehreren Standorten kann sich auf die Latenz und die Kosten des Dienstes auswirken.
Cloud Run ist in diesen Regionen verfügbar:
Unterliegt Preisstufe 1
asia-east1
(Taiwan)asia-northeast1
(Tokio)asia-northeast2
(Osaka)europe-north1
(Finnland) Niedriger CO2-Werteurope-southwest1
(Madrid) Niedriger CO2-Ausstoßeurope-west1
(Belgien) Niedriger CO2-Ausstoßeurope-west4
(Niederlande) Niedriger CO2-Ausstoßeurope-west8
(Mailand)europe-west9
(Paris) Niedriger CO2-Ausstoßme-west1
(Tel Aviv)us-central1
(Iowa) Niedriger CO2-Ausstoßus-east1
(South Carolina)us-east4
(Northern Virginia)us-east5
(Columbus)us-south1
(Dallas) Niedriger CO2-Ausstoßus-west1
(Oregon) Niedriger CO2-Ausstoß
Unterliegt Preisstufe 2
africa-south1
(Johannesburg)asia-east2
(Hongkong)asia-northeast3
(Seoul, Südkorea)asia-southeast1
(Singapur)asia-southeast2
(Jakarta)asia-south1
(Mumbai, Indien)asia-south2
(Delhi, Indien)australia-southeast1
(Sydney)australia-southeast2
(Melbourne)europe-central2
(Warschau, Polen)europe-west10
(Berlin) Niedriger CO2-Ausstoßeurope-west12
(Turin)europe-west2
(London, Vereinigtes Königreich) Niedriger CO2-Ausstoßeurope-west3
(Frankfurt, Deutschland) Niedriger CO2-Ausstoßeurope-west6
(Zürich, Schweiz) Niedriger CO2-Ausstoßme-central1
(Doha)me-central2
(Dammam)northamerica-northeast1
(Montreal) Niedriger CO2-Ausstoßnorthamerica-northeast2
(Toronto) Niedriger CO2-Ausstoßsouthamerica-east1
(Sao Paulo, Brasilien) Niedriger CO2-Ausstoßsouthamerica-west1
(Santiago, Chile) Niedriger CO2-Ausstoßus-west2
(Los Angeles)us-west3
(Salt Lake City)us-west4
(Las Vegas)
Wenn Sie bereits einen Cloud Run-Dienst erstellt haben, können Sie dessen Region im Cloud Run-Dashboard der Google Cloud Console aufrufen.
Codebeispiel abrufen
So rufen Sie das gewünschte Codebeispiel ab:
Klonen Sie das Beispiel-Repository auf Ihren lokalen Computer:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Sie können auch das Beispiel als ZIP-Datei herunterladen und extrahieren.
Wechseln Sie in das Verzeichnis, das den Cloud Run-Beispielcode enthält:
Node.js
cd nodejs-docs-samples/run/websockets/
Code verstehen
Socket.io ist eine Bibliothek, die eine bidirektionale Echtzeitkommunikation zwischen Browser und Server ermöglicht. Obwohl Socket.io keine WebSocket-Implementierung ist, umfasst es die Funktion, eine einfachere API für mehrere Kommunikationsprotokolle mit zusätzlichen Features, wie verbesserter Zuverlässigkeit, automatischer Neuverbindung sowie Broadcasting an einen oder alle Clients, bereitzustellen.
Clientseitige Integration
Der Client instanziiert eine neue Socket-Instanz für jede Verbindung. Da dieses Beispiel serverseitig gerendert wird, muss die Server-URL nicht definiert werden. Die Socket-Instanz kann Ereignisse ausgeben und abhören.
Serverseitige Integration
Auf der Serverseite wird der Socket.io-Server initialisiert und mit dem HTTP-Server verbunden. Ähnlich wie auf der Clientseite wird nach dem Herstellen einer Verbindung zum Client mit Socket.io eine Socket-Instanz für jede Verbindung erstellt, mit Nachrichten ausgegeben und überwacht werden können. Socket.io bietet auch eine einfache Schnittstelle zum Erstellen von "Chatrooms" oder einem beliebigen Kanal, dem Sockets beitreten und ihn verlassen können.
Socket.io stellt auch einen Redis-Adapter bereit, um Ereignisse an alle Clients zu senden, unabhängig davon, welcher Server den Socket bereitstellt. Socket.io verwendet ausschließlich den Pub/Sub-Mechanismus von Redis und speichert keine Daten.
Der Redis-Adapter von Socket.io kann den Redis-Client wiederverwenden, der zum Speichern des Nachrichtenverlaufs des Chatrooms verwendet wird. Jeder Container erstellt eine Verbindung zur Redis-Instanz und Cloud Run kann eine große Anzahl von Instanzen erstellen. Das sind deutlich weniger als die 65.000 Verbindungen, die Redis unterstützen kann. Wenn Sie diese Menge an Traffic unterstützen müssen, müssen Sie auch den Durchsatz des Connectors für den serverlosen VPC-Zugriff auswerten.
Verbindung wiederherstellen
Cloud Run hat eine maximale Zeitüberschreitung von 60 Minuten. Daher müssen Sie eine erneute Verbindungslogik für mögliche Zeitlimits hinzufügen. In einigen Fällen versucht Socket.io automatisch, die Verbindung nach einem Verbindungs- oder Verbindungsfehler wiederherzustellen. Es gibt keine Garantie dafür, dass der Client wieder eine Verbindung zur selben Instanz herstellt.
Instanzen bleiben bei einer aktiven Verbindung bestehen, bis alle Anfragen geschlossen oder das Zeitlimit überschritten werden. Auch wenn Sie die Sitzungsaffinität von Cloud Run verwenden, können neue Anfragen mit Load-Balancing auf aktive Container verteilt werden, sodass Container herunterskaliert werden können. Wenn Sie befürchten, dass eine große Anzahl von Containern nach einer Traffic-Spitze bestehen bleibt, können Sie den maximalen Zeitüberschreitungswert verringern, damit nicht verwendete Sockets häufiger bereinigt werden.
Dienst versenden
Erstellen einer Instanz von Memorystore for Redis:
gcloud redis instances create INSTANCE_ID --size=1 --region=REGION
Ersetzen Sie INSTANCE_ID durch den Namen der Instanz, z. B.
my-redis-instance
, und REGION_ID durch die Region für alle Ihre Ressourcen und Dienste, z. B.us-central1
.Der Instanz wird automatisch ein IP-Bereich aus dem Standarddienstnetzwerkbereich zugewiesen. In dieser Anleitung wird für den lokalen Cache von Nachrichten in der Redis-Instanz 1 GB Arbeitsspeicher verwendet. Weitere Informationen zum Bestimmen der anfänglichen Größe einer Memorystore-Instanz für Ihren Anwendungsfall.
Richten Sie einen Connector für serverlosen VPC-Zugriff ein.
Zum Herstellen einer Verbindung zu Ihrer Redis-Instanz benötigt Ihr Cloud Run-Dienst Zugriff auf das autorisierte VPC-Netzwerk der Redis-Instanz.
Jeder VPC-Connector benötigt ein eigenes
/28
-Subnetz, um Connector-Instanzen zu platzieren. Dieser IP-Bereich darf sich nicht mit vorhandenen IP-Adressreservierungen im VPC-Netzwerk überschneiden.10.8.0.0
(/28
) funktioniert beispielsweise in den meisten neuen Projekten oder Sie können einen anderen nicht verwendeten benutzerdefinierten IP-Bereich wie10.9.0.0
angeben (/28
). Sie können in der Google Cloud Console sehen, welche IP-Bereiche derzeit reserviert sind.gcloud compute networks vpc-access connectors create CONNECTOR_NAME \ --region REGION \ --range "10.8.0.0/28"
Ersetzen Sie CONNECTOR_NAME durch den Namen des Connectors.
Dieser Befehl erstellt einen Connector im Standard-VPC-Netzwerk, genauso wie die Redis-Instanz, mit der Maschinengröße
e2-micro
. Wenn Sie die Maschinengröße des Connectors erhöhen, kann dadurch der Durchsatz erhöht werden, allerdings steigen auch die Kosten. Der Connector muss sich außerdem in derselben Region wie die Redis-Instanz befinden. Serverlosen VPC-Zugriff konfigurierenDefinieren Sie eine Umgebungsvariable mit der IP-Adresse des autorisierten Netzwerks der Redis-Instanz:
export REDISHOST=$(gcloud redis instances describe INSTANCE_ID --region REGION --format "value(host)")
Erstellen Sie ein Dienstkonto, das als Dienstidentität dient. Standardmäßig hat dieses keine anderen Berechtigungen als die Projektmitgliedschaft.
gcloud iam service-accounts create chat-identity gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:chat-identity@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/serviceusage.serviceUsageConsumer
Erstellen Sie das Container-Image und stellen Sie es in Cloud Run bereit:
gcloud run deploy chat-app --source . \ --vpc-connector CONNECTOR_NAME \ --allow-unauthenticated \ --timeout 3600 \ --service-account chat-identity \ --update-env-vars REDISHOST=$REDISHOST
Beantworten Sie die Aufforderungen, die erforderlichen APIs zu installieren, indem Sie nach Aufforderung
y
antworten. Dies ist nur einmal für ein Projekt erforderlich. Antworten Sie auf andere Aufforderungen, indem Sie die Plattform und Region angeben, sofern Sie diese nicht wie auf der Einrichtungsseite beschrieben eingerichtet haben. Weitere Informationen zum Aus Quellcode bereitstellen.
Testen
So testen Sie den gesamten Dienst:
Rufen Sie im Browser die URL auf, die Sie im oben beschriebenen Bereitstellungsschritt erhalten haben.
Geben Sie Ihren Namen und einen Chatroom ein, um sich anzumelden.
Nachricht an den Chatroom senden.
Wenn Sie sich dafür entscheiden, mit der Entwicklung dieser Dienste fortzufahren, denken Sie daran, dass diese nur eingeschränkten IAM-Zugriff (Identity and Access Management) auf den Rest von Google Cloud haben und ihnen zusätzliche IAM-Rollen zugewiesen werden müssen, um auf viele andere Dienste zugreifen zu können.
Bereinigen
Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen, löschen Sie die für die Anleitung erstellten Ressourcen.
Projekt löschen
Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das zum Ausführen der Anleitung erstellte Projekt löschen.
So löschen Sie das Projekt:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Anleitungsressourcen löschen
Löschen Sie den Cloud Run-Dienst, den Sie in dieser Anleitung bereitgestellt haben:
gcloud run services delete SERVICE-NAME
Dabei ist SERVICE-NAME der von Ihnen ausgewählte Dienstname.
Sie können Cloud Run-Dienste auch über die Google Cloud Console löschen.
Entfernen Sie die Konfiguration der Standardregion gcloud, die Sie während der Einrichtung für die Anleitung hinzugefügt haben:
gcloud config unset run/region
Entfernen Sie die Projektkonfiguration:
gcloud config unset project
Löschen Sie sonstige Google Cloud-Ressourcen, die in dieser Anleitung erstellt wurden:
Nächste Schritte
Weitere Informationen zur Funktionsweise von Socket.io und zur erweiterten Nutzung.
Weitere Informationen zum Konfigurieren des serverlosen VPC-Zugriffs
Lesen Sie die Best Practices für Memorystore und WebSockets in Cloud Run verwenden.
Sehen Sie sich die Diagnosetools für den serverlosen VPC-Zugriff an, um alle serverlosen Netzwerkprobleme zu beheben.