针对 Cloud Run 优化 Node.js 应用

本指南介绍了适用于在 Node.js 运行时上运行且使用 JavaScript 或 TypeScript 编写的 Cloud Run 服务的优化。本页面上的信息是对常规开发技巧的补充,这些技巧同样适用于 Node.js。

优化启动时间

通过优化启动时间,您可以缩短延迟时间、提高响应速度并实现有效的费用优化。本部分介绍了优化启动时间的不同方法。

使用 node 而不是 npm 启动应用

直接使用 node index.js 而不是 npm start 启动应用,因为 npm 会增加额外的延迟时间。

如需使用 node index.js 启动应用,请按照以下任一方法操作:

  • 在 Dockerfile 中使用 CMD node index.js,例如:

    CMD node index.js
    
  • node index.js 设置为入口点。使用 Google Cloud CLI 运行以下命令:

    gcloud run deploy SERVICE --command "node index.js"
    

    如需详细了解入口点配置和相关选项,请参阅为服务配置容器

如果您在没有 Dockerfile 的情况下使用源代码部署,Cloud Run 会执行优化。

打包代码

打包器是一种构建工具,可优化 JavaScript 源文件的布局,以缩短加载时间。一些常见的打包器优化包括摇树、缩减大小和合并小文件。打包器可显著减小软件包的总大小并减少文件读取请求的数量。常见的 JavaScript 打包器有 esbuildwebpackrollup

延迟加载依赖项

在启动时,Cloud Run 会从远程位置流式传输代码加载的每个文件。与本地文件系统相比,使用远程位置会导致每次读取文件时产生额外的延迟时间。Node.js 软件包可能会使用许多具有间接依赖项的文件。我们建议您仅加载服务器启动所需的依赖项,并使用动态导入延迟加载其他依赖项,而不是在启动时导入所有依赖项。

例如,不要在模块顶部使用 import { Storage } from '@google-cloud/storage' 等导入,而是在函数需要导入的对象时,在函数中使用 import(),例如:

const { Storage } = await import('@google-cloud/storage');

如需确定启动期间加载的模块以及每个模块在您的机器上加载所用的时间,请运行以下命令:

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

配置超时

Node.js 内置 HTTP 服务器的默认超时时间为 2 分钟。如果 Cloud Run 服务的请求超时时间更长,请使用 server.setTimeout(msecs) 修改超时时间。您还必须修改基于 Node.js 服务器构建的框架(例如 Express)的超时时间。如需在 Node.js 中实现无限超时并依赖 Cloud Run 的内置超时,请使用 server.setTimeout(0)