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.

App mit node statt npm starten

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

Sie haben zwei Möglichkeiten, Ihre Anwendung mit node index.js zu starten:

  • Verwenden Sie CMD node index.js in Ihrem Dockerfile, z. B.:

    CMD node index.js
    
  • node index.js als Einstiegspunkt festlegen Führen Sie den 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, mit dem das Layout Ihrer JavaScript-Quelldateien für schnellere Ladezeiten optimiert wird. Zu den gängigen Bundler-Optimierungen gehören Tree Shaking, Minimierung und das Zusammenfassen kleiner Dateien. Bundler reduzieren die Gesamtgröße des Bundles und die Anzahl der Dateileseanfragen erheblich. Häufig verwendete JavaScript-Bundler sind esbuild, webpack und rollup.

Abhängigkeiten verzögert laden

Beim Start streamt Cloud Run jede Datei, die Ihr Code von einem Remote-Speicherort lädt. Im Vergleich zu einem lokalen Dateisystem führt die Verwendung eines Remote-Speicherorts zu zusätzlicher Latenz bei jedem Lesen einer Datei. 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 des Servers erforderlich sind, und die anderen Abhängigkeiten mit dynamischen Importen 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

Zeitlimit konfigurieren

Der integrierte Node.js-HTTP-Server hat ein Standardzeitlimit von zwei Minuten. Wenn das Zeitlimit für Anfragen Ihres Cloud Run-Dienstes länger ist, ändern Sie das Zeitlimit mit server.setTimeout(msecs). Sie müssen auch das Zeitlimit für Frameworks ändern, die auf dem Node.js-Server basieren, z. B. Express. Wenn Sie in Node.js ein unbegrenztes Zeitlimit festlegen und das integrierte Zeitlimit von Cloud Run verwenden möchten, verwenden Sie server.setTimeout(0).