Google is committed to advancing racial equity for Black communities. See how.
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Tipps

In diesem Dokument werden bewährte Methoden zum Entwerfen, Implementieren, Testen und Bereitstellen von Cloud-Funktionen beschrieben.

Richtigkeit

In diesem Abschnitt werden allgemeine Best Practices zum Entwerfen und Implementieren von Cloud-Funktionen beschrieben.

Schreiben Sie idempotente Funktionen

Ihre Funktionen sollten das gleiche Ergebnis liefern, auch wenn sie mehrmals aufgerufen werden. Auf diese Weise können Sie einen Aufruf erneut versuchen, wenn der vorherige Aufruf in Ihrem Code fehlschlägt. Weitere Informationen finden Sie unter Wiederholen von Hintergrundfunktionen .

Starten Sie keine Hintergrundaktivitäten

Hintergrundaktivität ist alles, was passiert, nachdem Ihre Funktion beendet wurde. Ein Funktionsaufruf wird beendet, sobald die Funktion zurückkehrt oder auf andere Weise den Abschluss signalisiert, z. B. durch Aufrufen des callback in den Hintergrundfunktionen von Node.j. Code, der nach ordnungsgemäßer Beendigung ausgeführt wird, kann nicht auf die CPU zugreifen und macht keine Fortschritte.

Wenn ein nachfolgender Aufruf in derselben Umgebung ausgeführt wird, wird Ihre Hintergrundaktivität fortgesetzt und der neue Aufruf gestört. Dies kann zu unerwartetem Verhalten und schwer zu diagnostizierenden Fehlern führen. Der Zugriff auf das Netzwerk nach Beendigung einer Funktion führt normalerweise zum Zurücksetzen der Verbindungen ( ECONNRESET Fehlercode).

Hintergrundaktivitäten können häufig in Protokollen einzelner Aufrufe erkannt werden, indem alles gefunden wird, was nach der Zeile protokolliert wird, die besagt, dass der Aufruf beendet wurde. Hintergrundaktivitäten können manchmal tiefer im Code vergraben sein, insbesondere wenn asynchrone Vorgänge wie Rückrufe oder Zeitgeber vorhanden sind. Überprüfen Sie Ihren Code, um sicherzustellen, dass alle asynchronen Vorgänge abgeschlossen sind, bevor Sie die Funktion beenden.

Löschen Sie immer temporäre Dateien

Der lokale Festplattenspeicher im temporären Verzeichnis ist ein speicherinternes Dateisystem. Dateien, die Sie schreiben, belegen den für Ihre Funktion verfügbaren Speicher und bleiben manchmal zwischen den Aufrufen bestehen. Wenn diese Dateien nicht explizit gelöscht werden, kann dies möglicherweise zu einem Speichermangel und einem anschließenden Kaltstart führen.

Sie können den von einer einzelnen Funktion verwendeten Speicher anzeigen, indem Sie ihn in der Liste der Funktionen in der GCP-Konsole auswählen und das Diagramm zur Speichernutzung auswählen.

Versuchen Sie nicht, außerhalb des temporären Verzeichnisses zu schreiben, und verwenden Sie plattform- / betriebssystemunabhängige Methoden, um Dateipfade zu erstellen.

Sie können den Speicherbedarf reduzieren, wenn Sie größere Dateien mithilfe von Pipelining verarbeiten. Sie können beispielsweise eine Datei in Cloud Storage verarbeiten, indem Sie einen Lesestream erstellen, ihn durch einen Stream-basierten Prozess leiten und den Ausgabestream direkt in Cloud Storage schreiben.

Werkzeuge

Dieser Abschnitt enthält Richtlinien zur Verwendung von Tools zum Implementieren, Testen und Interagieren mit Cloud-Funktionen.

Lokale Entwicklung

Die Funktionsbereitstellung dauert einige Zeit, daher ist es häufig schneller, den Code Ihrer Funktion lokal zu testen.

Firebase-Entwickler können den Firebase CLI Cloud Functions Emulator verwenden .

Verwenden Sie Sendgrid, um E-Mails zu senden

Cloud-Funktionen erlauben keine ausgehenden Verbindungen an Port 25, sodass Sie keine nicht sicheren Verbindungen zu einem SMTP-Server herstellen können. Die empfohlene Methode zum Senden von E-Mails ist die Verwendung von SendGrid . Weitere Optionen zum Senden von E-Mails finden Sie unter Senden von E-Mails in einem Instanz- Lernprogramm für Google Compute Engine.

Performance

In diesem Abschnitt werden bewährte Methoden zur Leistungsoptimierung beschrieben.

Verwenden Sie Abhängigkeiten mit Bedacht

Da Funktionen zustandslos sind, wird die Ausführungsumgebung häufig von Grund auf neu initialisiert (während eines sogenannten Kaltstarts ). Bei einem Kaltstart wird der globale Kontext der Funktion ausgewertet.

Wenn Ihre Funktionen Module importieren, kann die Ladezeit für diese Module die Aufruflatenz während eines Kaltstarts erhöhen. Sie können diese Latenz sowie die für die Bereitstellung Ihrer Funktion erforderliche Zeit reduzieren, indem Sie Abhängigkeiten korrekt laden und keine Abhängigkeiten laden, die Ihre Funktion nicht verwendet.

Verwenden Sie globale Variablen, um Objekte in zukünftigen Aufrufen wiederzuverwenden

Es gibt keine Garantie dafür, dass der Status einer Cloud-Funktion für zukünftige Aufrufe erhalten bleibt. Cloud-Funktionen recyceln jedoch häufig die Ausführungsumgebung eines vorherigen Aufrufs. Wenn Sie eine Variable im globalen Bereich deklarieren, kann ihr Wert in nachfolgenden Aufrufen wiederverwendet werden, ohne dass eine Neuberechnung erforderlich ist.

Auf diese Weise können Sie Objekte zwischenspeichern, deren Neuerstellung bei jedem Funktionsaufruf teuer sein kann. Das Verschieben solcher Objekte vom Funktionskörper in den globalen Bereich kann zu erheblichen Leistungsverbesserungen führen. Im folgenden Beispiel wird ein schweres Objekt nur einmal pro Funktionsinstanz erstellt und für alle Funktionsaufrufe freigegeben, die die angegebene Instanz erreichen:

console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
    console.log('Function invocation');
    const perFunction = lightweightComputation();

    res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});

Es ist besonders wichtig, Netzwerkverbindungen, Bibliotheksreferenzen und API-Clientobjekte im globalen Bereich zwischenzuspeichern. Beispiele finden Sie unter Optimieren des Netzwerks .

Führen Sie eine verzögerte Initialisierung globaler Variablen durch

Wenn Sie Variablen im globalen Bereich initialisieren, wird der Initialisierungscode immer über einen Kaltstartaufruf ausgeführt, wodurch sich die Latenz Ihrer Funktion erhöht. Wenn einige Objekte nicht in allen Codepfaden verwendet werden, sollten Sie sie bei Bedarf träge initialisieren:

const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
    doUsualWork();
    if(unlikelyCondition()){
        myCostlyVariable = myCostlyVariable || buildCostlyVariable();
    }
    res.status(200).send('OK');
});

Dies ist besonders wichtig, wenn Sie mehrere Funktionen in einer einzigen Datei definieren und verschiedene Funktionen unterschiedliche Variablen verwenden. Wenn Sie keine verzögerte Initialisierung verwenden, verschwenden Sie möglicherweise Ressourcen für Variablen, die initialisiert, aber nie verwendet werden.

Zusätzliche Ressourcen

Erfahren Sie mehr über die Optimierung der Leistung in den "Google Cloud Performance - Atlas" Video Cloud - Funktionen Cold Boot - Zeit .