Netzwerk optimieren (1. Generation)
Die Einfachheit von Cloud Run Functions ermöglicht Ihnen, Code schnell zu entwickeln und in einer serverlosen Umgebung auszuführen. Bei mittlerer Skalierung sind die Kosten für das Ausführen von Funktionen gering und es besteht möglicherweise kein unmittelbarer Bedarf dafür, den Code zu optimieren. Je größer Ihre Bereitstellung jedoch wird, desto wichtiger wird auch die Optimierung des Codes.
In diesem Dokument wird beschrieben, wie Sie das Netzwerk für Ihre Funktionen optimieren. Eine Netzwerkoptimierung bieten unter anderem folgende Vorteile:
- Sie können die CPU-Zeit reduzieren, die für das Erstellen neuer Verbindungen bei jedem Funktionsaufruf benötigt wird.
- Sie können die Wahrscheinlichkeit verringern, dass Kontingente für Verbindungen oder DNS aufgebraucht werden.
Persistente Verbindungen aufrechterhalten
In diesem Abschnitt wird anhand von Beispielen gezeigt, wie Sie in einer Funktion persistente Verbindungen aufrechterhalten. Ohne persistente Verbindungen können die Verbindungskontingente schnell aufgebraucht sein.
Die folgenden Szenarien werden in diesem Abschnitt behandelt:
- HTTP/S
- Google APIs
HTTP/S-Anfragen
Mit dem optimierten Code-Snippet unten wird veranschaulicht, wie Sie persistente Verbindungen aufrechterhalten, anstatt bei jedem Funktionsaufruf eine neue Verbindung zu erstellen:
Node.js
Python
Go
PHP
Wir empfehlen die Verwendung des Guzzle PHP-HTTP-Frameworks, um Anfragen zu senden, da es nichtflüchtige Verbindungen automatisch verarbeitet.
Auf Google APIs zugreifen
Im folgenden Beispiel wird Cloud Pub/Sub eingesetzt. Der Ansatz funktioniert jedoch auch für andere Clientbibliotheken, z. B. Cloud Natural Language oder Cloud Spanner. Die erzielten Leistungsverbesserungen können von der aktuellen Implementierung bestimmter Clientbibliotheken abhängen.
Beim Erstellen eines Pub/Sub-Clientobjekts werden eine Verbindung und zwei DNS-Abfragen pro Aufruf erzeugt. Erstellen Sie das Pub/Sub-Clientobjekt global, um unnötige Verbindungen und DNS-Abfragen zu vermeiden, wie im folgenden Beispiel gezeigt:
Node.js
Python
Go
Ausgehende Verbindungen werden zurückgesetzt
Verbindungsstreams von Ihrer Funktion zu VPC und dem Internet können gelegentlich beendet und ersetzt werden, wenn die zugrunde liegende Infrastruktur neu gestartet oder aktualisiert wird. Wenn Ihre Anwendung langlebige Verbindungen wiederverwendet, sollten Sie Ihre Anwendung so konfigurieren, dass Verbindungen wiederhergestellt werden, um eine Wiederverwendung einer inaktiven Verbindung zu vermeiden.
Lasttest für Ihre Funktion
Wenn Sie messen möchten, wie viele Verbindungen im Durchschnitt von einer Funktion erstellt werden, können Sie sie als HTTP-Funktion bereitstellen und in einem Leistungstest-Framework bei einer bestimmten Anzahl von Abfragen pro Sekunde aufrufen. Dazu können Sie z. B. Artillery verwenden, das sich mit einer einzigen Zeile aufrufen lässt:
$ artillery quick -d 300 -r 30 URL
Mit diesem Befehl wird die angegebene URL 300 Sekunden lang bei 30 Abfragen pro Sekunde abgerufen.
Nach dem Test überprüfen Sie die Nutzungswerte Ihres Verbindungskontingents in der Google Cloud Console auf der Kontingentseite der Cloud Run Functions API. Wenn die Nutzung beständig bei 30 Abfragen oder einem Vielfachen davon liegt, erstellt die Funktion mit jedem Aufruf eine (oder mehrere) Verbindungen. Nach der Optimierung des Codes sollten nur zu Beginn des Tests ein paar wenige Verbindungen (10–30) erzeugt werden.
Auf derselben Seite können Sie im Diagramm für das CPU-Kontingent auch die CPU-Kosten vor und nach der Optimierung vergleichen.