Node.js-Anwendungen für Cloud Run optimieren

In diesem Leitfaden werden Optimierungen für Cloud Run-Dienste beschrieben, die in JavaScript oder TypeScript geschrieben sind und in der Node.js-Laufzeit ausgeführt werden. Die Informationen auf dieser Seite ergänzen die allgemeinen Entwicklungstipps, die auch für Node.js gelten.

Startzeit optimieren

Durch die Optimierung der Startzeit können Sie die Latenz reduzieren, die Reaktionsfähigkeit verbessern und eine effektive Kostenoptimierung erreichen. In diesem Abschnitt werden verschiedene Möglichkeiten zur Optimierung der Startzeit beschrieben.

Starten Sie Ihre App mit node anstelle von npm.

Starten Sie Ihre Anwendung direkt mit node index.js anstelle von npm start, da npm zusätzliche Latenz verursacht.

Um Ihre Anwendung mit node index.js zu starten, befolgen Sie eine dieser folgenden Methoden:

  • Verwenden Sie CMD node index.js in Ihrer Dockerfile, zum Beispiel:

    CMD node index.js
    
  • node index.js als Einstiegspunkt festlegen Führen Sie folgenden Befehl mit der Google Cloud CLI aus:

    gcloud run deploy SERVICE --command "node index.js"
    

    Weitere Informationen und Optionen zum Konfigurieren von Einstiegspunkten finden Sie unter Container für Dienste konfigurieren.

Wenn Sie Quellcodebereitstellungen ohne Dockerfile verwenden, führt Cloud Run die Optimierung durch.

Code bündeln

Ein Bundler ist ein Build-Tool, das das Layout Ihrer JavaScript-Quelldateien optimiert, um schnellere Ladezeiten zu erzielen. Zu den gängigen Optimierungen von Bundlern gehören Tree Shaking, Minifizierung und das Zusammenfassen kleiner Dateien. Bundler reduzieren die Gesamtgröße des Bundles erheblich und verringern die Anzahl der Dateileseanforderungen. Gängige JavaScript-Bundler sind esbuild, webpack und rollup.

Lazy Loading Abhängigkeiten

Beim Start streamt Cloud Run jede Datei, die Ihr Code von einem entfernten Speicherort lädt. Im Vergleich zu einem lokalen Dateisystem führt die Verwendung eines entfernten Speicherorts bei jedem Lesevorgang einer Datei zu zusätzlichen Verzögerungen. Node.js-Pakete können viele Dateien mit indirekten Abhängigkeiten verwenden. Anstatt alle Abhängigkeiten beim Start zu importieren, empfehlen wir, nur die Abhängigkeiten zu laden, die für den Start Ihres Servers erforderlich sind, und die anderen Abhängigkeiten mit dynamic imports verzögert zu laden.

Anstatt beispielsweise import { Storage } from '@google-cloud/storage' oben im Modul zu verwenden, nutzen Sie import() in der Funktion, wenn das importierte Objekt erforderlich ist, z. B.:

const { Storage } = await import('@google-cloud/storage');

Führen Sie den folgenden Befehl aus, um die Module zu ermitteln, die beim Start geladen werden, und die Zeit, die jedes Modul zum Laden auf Ihrem Computer benötigt:

node --trace-event-categories node.module_timer --trace-event-file-pattern 'trace-events.log' index.js

Timeout konfigurieren

In Node.js Version 14 und höher verfügt der integrierte HTTP-Server über einenStandard-Timeout von 0 (kein Timeout). In Node.js-Versionen vor 14 betrug das Standard-Timeout 2 Minuten. Wenn das Anfrage-Timeout Ihres Cloud Run-Dienstes zu lang ist, ändern Sie das Timeout mit server.setTimeout(msecs). Sie müssen auch das Timeout für Frameworks anpassen, die auf dem Node.js-Server erstellt werden, wie z. B. Express. Um in Node.js ein unbegrenztes Timeout zu erreichen und auf das integrierte Timeout von Cloud Run zurückzugreifen, verwenden Sie server.setTimeout(0).