Questa guida descrive le ottimizzazioni per i servizi Cloud Run scritti in JavaScript o TypeScript ed eseguiti sul runtime Node.js. Le informazioni contenute in questa pagina integrano i suggerimenti di sviluppo generali, 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,
poiché npm aggiunge una latenza extra.
Per avviare l'applicazione con node index.js, segui uno di questi metodi:
Utilizza
CMD node index.jsnel Dockerfile, ad esempio:CMD node index.jsImposta
node index.jscome punto di ingresso. Esegui il seguente 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 del codice sorgente senza un Dockerfile, Cloud Run esegue l'ottimizzazione.
Creare un bundle del 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 tree shaking, la minimizzazione 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 comuni sono esbuild, webpack e rollup.
Caricare le dipendenze in modo differito
All'avvio, Cloud Run esegue lo streaming di ogni file caricato dal codice da una località remota. Rispetto a un file system locale, l'utilizzo di una località 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 le dipendenze necessarie per l'avvio del server e di caricare in modo differito le altre dipendenze 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 caricati durante l'avvio e il tempo impiegato da ogni modulo per caricarsi sulla tua macchina, esegui il seguente comando:
node --trace-event-categories node.module_timer --trace-event-file-pattern 'trace-events.log' index.js
Configurare il timeout
In Node.js versione 14 e successive, il server HTTP integrato ha un timeout predefinito
di 0 (nessun timeout). Nelle versioni di Node.js precedenti alla 14, il timeout predefinito era di 2 minuti. Se il timeout della richiesta del 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).