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.

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, já que npm adiciona mais latência.

Para iniciar o aplicativo 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 fará 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 do 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 agrupadores JavaScript comuns são esbuild, webpack e rollup.

Carregar dependências de forma lenta

Na inicialização, o Cloud Run transmite cada arquivo que seu código carrega de um local remoto. Em comparação com um sistema de arquivos local, o uso de um local remoto causa mais latência 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 que você carregue apenas as dependências necessárias para o início do servidor e carregue as outras dependências de forma lenta com importações dinâmicas.

Por exemplo, em vez de usar import 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 um para carregar na 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

O servidor HTTP integrado do Node.js tem um tempo limite padrão de dois minutos. Se o tempo limite de solicitação do serviço do Cloud Run for maior, modifique o tempo limite usando server.setTimeout(msecs). Também é necessário modificar o tempo limite para frameworks criados no servidor Node.js, como o Express. Para ter um tempo limite ilimitado em Node.js e usar o tempo limite integrado do Cloud Run, use server.setTimeout(0).