Questa guida descrive le ottimizzazioni per i servizi Cloud Run scritti in JavaScript o TypeScript, in esecuzione sul runtime Node.js. Le informazioni contenute in questa pagina integrano i suggerimenti generali per lo sviluppo, che si applicano anche a Node.js.
Ottimizzare il tempo di avvio
Ottimizzando il tempo di avvio, puoi ridurre la latenza, migliorare la reattività e ottenere un'ottimizzazione efficace dei costi. Questa sezione descrive diversi modi per ottimizzare il tempo di avvio.
Avviare l'app utilizzando node
anziché npm
Avvia l'applicazione direttamente utilizzando node index.js
anziché npm start
,
in quanto npm
aggiunge ulteriore latenza.
Per iniziare la procedura di richiesta con node index.js
, segui uno di questi metodi:
Utilizza
CMD node index.js
nel Dockerfile, ad esempio:CMD node index.js
Imposta
node index.js
come punto di ingresso. Esegui questo comando utilizzando Google Cloud CLI:gcloud run deploy SERVICE --command "node index.js"
Per ulteriori informazioni e opzioni per la configurazione dei punti di ingresso, consulta Configurare i container per i servizi.
Se utilizzi i deployment delle origini senza un Dockerfile, Cloud Run esegue l'ottimizzazione.
Raggruppa il codice
Un bundler è uno strumento di build che ottimizza il layout dei file di origine JavaScript per tempi di caricamento più rapidi. Alcune ottimizzazioni comuni dei bundler includono l'eliminazione del tree shaking, la minificazione e l'unione di file di piccole dimensioni. I bundler riducono notevolmente le dimensioni totali del bundle e il numero di richieste di lettura dei file. I bundler JavaScript più comuni sono esbuild, webpack e rollup.
Caricamento lento delle dipendenze
All'avvio, Cloud Run esegue lo streaming di ogni file caricato dal codice da una posizione remota. Rispetto a un file system locale, l'utilizzo di una posizione remota comporta una latenza aggiuntiva ogni volta che viene letto un file. I pacchetti Node.js potrebbero utilizzare molti file con dipendenze indirette. Anziché importare tutte le dipendenze all'avvio, ti consigliamo di caricare solo quelle necessarie per l'avvio del server e di caricare le altre in modo differito con le importazioni dinamiche.
Ad esempio, anziché utilizzare l'importazione nella parte superiore del modulo, ad esempio
import { Storage } from '@google-cloud/storage'
, utilizza import()
nella funzione
quando richiede l'oggetto importato, ad esempio:
const { Storage } = await import('@google-cloud/storage');
Per identificare i moduli che vengono caricati all'avvio e il tempo impiegato da ciascun modulo per caricarsi sul tuo computer, esegui il seguente comando:
node --trace-event-categories node.module_timer --trace-event-file-pattern 'trace-events.log' index.js
Configura timeout
Il server HTTP integrato di Node.js ha un timeout predefinito di due minuti. Se il
timeout della richiesta del tuo servizio Cloud Run è più lungo, modifica il timeout
utilizzando server.setTimeout(msecs)
. Devi anche modificare il timeout per i framework
basati sul server Node.js, come Express. Per
ottenere un timeout illimitato in Node.js e fare affidamento sul timeout
integrato di Cloud Run, utilizza server.setTimeout(0)
.