Este guia descreve otimizações para serviços do Cloud Run escritos em JavaScript ou TypeScript, executados no ambiente de execução do Node.js. As informações desta página complementam as dicas gerais de desenvolvimento, que também se aplicam ao Node.js.
Otimizar o tempo de inicialização
Ao otimizar o tempo de inicialização, é possível reduzir a latência, melhorar a capacidade de resposta e alcançar uma otimização de custos eficaz. Esta seção descreve diferentes maneiras de otimizar o tempo de inicialização.
Iniciar o app usando node em vez de npm
Inicie o aplicativo diretamente usando node index.js em vez de npm start,
porque npm adiciona latência extra.
Para iniciar o aplicativo com node index.js, siga um destes métodos:
Use
CMD node index.jsno Dockerfile, por exemplo:CMD node index.jsDefina
node index.jscomo o ponto de entrada. Execute o comando a seguir usando a Google Cloud CLI:gcloud run deploy SERVICE --command "node index.js"Para mais informações e opções de configuração de pontos de entrada, consulte Configurar contêineres para serviços.
Se você usar implantações de origem sem um Dockerfile, o Cloud Run vai realizar a otimização.
Agrupar o código
Um bundler é uma ferramenta de build que otimiza o layout dos arquivos de origem JavaScript para tempos de carregamento mais rápidos. Algumas otimizações comuns de bundler incluem tree shaking, minificação e coalescência de arquivos pequenos. Os bundlers reduzem significativamente o tamanho total do pacote e o número de solicitações de leitura de arquivos. Os bundlers JavaScript comuns são esbuild, webpack e rollup.
Carregar dependências de forma lenta
Na inicialização, o Cloud Run transmite cada arquivo que o código carrega de um local remoto. Em comparação com um sistema de arquivos local, o uso de um local remoto leva a uma latência adicional sempre que um arquivo é lido. Os pacotes do Node.js podem usar muitos arquivos com dependências indiretas. Em vez de importar todas as dependências na inicialização, recomendamos carregar apenas as dependências necessárias para que o servidor seja iniciado e carregar as outras dependências de forma lenta com importações dinâmicas.
Por exemplo, em vez de usar a importação na parte de cima do módulo, como
import { Storage } from '@google-cloud/storage', use import() na função
quando ela exigir o objeto importado, por exemplo:
const { Storage } = await import('@google-cloud/storage');
Para identificar os módulos que são carregados durante a inicialização e o tempo gasto por cada módulo para carregar na máquina, execute o comando a seguir:
node --trace-event-categories node.module_timer --trace-event-file-pattern 'trace-events.log' index.js
Configurar o tempo limite
Na versão 14 e mais recentes do Node.js, o servidor HTTP integrado tem um tempo limite padrão
de 0 (sem tempo limite). Nas versões do Node.js anteriores à 14, o tempo limite padrão era de 2 minutos. Se o tempo limite de solicitação do serviço do Cloud Run for maior, modifique o tempo limite usando server.setTimeout(msecs). Você também precisa modificar o
tempo limite para frameworks criados no servidor Node.js, como o
Express. Para alcançar um tempo limite ilimitado no Node.js e confiar no tempo limite integrado do Cloud Run, use server.setTimeout(0).