Otimizar aplicativos Node.js para o Cloud Run

Neste guia, descrevemos 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.

Otimize 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.

Inicie o app usando node em vez de npm

Inicie seu aplicativo diretamente usando node index.js em vez de npm start, pois npm adiciona latência extra.

Para iniciar sua aplicação com node index.js, siga um destes métodos:

  • Use CMD node index.js no Dockerfile. Por exemplo:

    CMD node index.js
    
  • Defina node index.js como seu 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 realizará a otimização.

Agrupe seu código

Um bundler é uma ferramenta de compilação que otimiza o layout dos seus arquivos de código-fonte JavaScript para tempos de carregamento mais rápidos. Algumas otimizações comuns de bundlers incluem tree shaking, minificação e coalescência de arquivos pequenos. Os empacotadores 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.

Carregamento lento de dependências

Ao iniciar, o Cloud Run transmite cada arquivo carregado pelo seu código a partir de um local remoto. Em comparação com um sistema de arquivos local, o uso de um local remoto resulta em latência adicional cada vez que um arquivo é lido. Os pacotes Node.js podem usar muitos arquivos com dependências indiretas. Em vez de importar todas as dependências na inicialização, recomendamos que você carregue apenas as dependências necessárias para que seu servidor inicie e carregue as outras dependências de forma assíncrona com importações dinâmicas.

Por exemplo, em vez de usar `import` no início do seu 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 que cada módulo leva para carregar em sua máquina, execute o seguinte comando:

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

Configurar tempo limite

No Node.js versão 14 e posteriores, o servidor HTTP integrado possui umtempo 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 da solicitação do seu serviço Cloud Run for maior, modifique o tempo limite usando server.setTimeout(msecs). Você também deve modificar o tempo limite para frameworks que são construídos no servidor Node.js, como Express. Para obter um tempo limite ilimitado no Node.js e depender do tempo limite integrado do Cloud Run, use server.setTimeout(0).