运行时
在 Deno DeployEA 中,所有应用程序都在安全、隔离的 Linux 环境中使用标准的 Deno 运行时执行。
Deno DeployEA 中使用的 Deno 运行时是标准的 Deno 运行时,完全支持 Deno CLI 的所有功能,包括 JSR 和 NPM 依赖项、文件系统读写、发起网络请求、启动子进程以及加载 FFI 和 Node 原生插件。
Deno 运行时以 --allow-all
权限运行。
自定义标志不能传递给 Deno 运行时。
运行时环境 跳转到标题
运行时环境是基于 Linux 的环境,运行在 x64 或 ARM64 架构上。运行时环境中可用的确切工具集可能会发生变化,因此不能依赖它们。
目前 Deno DeployEA 运行在 Deno 2.3.2 上。
生命周期 跳转到标题
Deno DeployEA 在无服务器环境中运行应用程序。这意味着应用程序并非始终运行,只有在收到请求时才启动。当在一段时间内没有收到传入流量时,应用程序会停止。
应用程序可以随时启动和停止。它们应该快速启动,以便及时响应传入请求。
同一应用程序的多个实例可以同时运行。例如,一个实例可能在美国运行,另一个在欧洲运行。每个实例都与其他实例完全隔离,不共享 CPU、内存或磁盘资源。在需要时,例如处理高流量或基础设施更新期间,同一区域也可以启动多个实例。
启动 跳转到标题
当系统决定启动应用程序时,它会为应用程序配置一个新的沙盒环境。此环境与其他所有应用程序隔离。
然后,它使用配置的入口点启动应用程序,并等待 HTTP 服务器启动。如果应用程序在 HTTP 服务器启动之前崩溃,则触发启动的请求将以 502 Bad Gateway 错误失败。
应用程序启动后,传入请求会被路由到该应用程序,响应则发送回客户端。
关闭 跳转到标题
应用程序会一直保持活跃,直到在一段时间内没有收到新的传入请求或发送响应(包括响应体字节)。确切的超时时间在 5 秒到 10 分钟之间。活动传输数据(包括 ping/pong 帧)的 WebSocket 连接也会使应用程序保持活跃。
一旦系统决定停止应用程序,它会向应用程序发送 SIGINT
信号作为关闭触发器。从此时起,应用程序有 5 秒钟时间进行优雅关闭,否则将被 SIGKILL
信号强制终止。
驱逐 跳转到标题
有时,即使应用程序正在积极接收流量,隔离实例也可能会关闭。这可能发生的一些例子是:
- 应用程序已扩容以处理负载,但负载已减少到足以再次由单个实例处理。
- 执行实例的底层服务器资源受限,无法继续运行此应用程序实例。
- 底层基础设施正在更新或已发生故障。
当系统决定驱逐应用程序时,它会尝试尽早将流量从被驱逐的实例中转移走。有时这意味着请求会等待新实例启动,即使现有实例已经在运行。
当应用程序只处理快速完成的请求时,驱逐通常是不可察觉的。对于处理长时间运行请求或 WebSocket 的应用程序,驱逐可能会更明显,因为应用程序可能需要在仍在处理请求时被驱逐。系统会尽量避免这些情况,但并非总是可行。
流量从旧实例中转移后,系统会发送 SIGINT
信号以触发优雅关闭。应用程序应快速完成处理所有剩余请求,并关闭 WebSocket 和其他长时间运行的连接。发起长时间运行请求的客户端应准备好处理这些中断,并在断开连接时重新连接。
在 SIGINT
信号发送 5 秒后,如果旧实例尚未优雅关闭,它将被 SIGKILL
信号强制终止。
冷启动 跳转到标题
由于应用程序并非始终运行,因此在收到请求时可能需要启动。这称为冷启动。Deno DeployEA 中的冷启动经过高度优化,对于“Hello World”应用程序可在 100 毫秒内完成,对于大型应用程序可在几百毫秒内完成。
Deno DeployEA 使用多种优化措施来实现快速冷启动:
-
沙盒和 Deno 运行时已预先配置,以确保在启动应用程序时无需从头创建它们。
-
当客户端发送第一个 TCP 数据包以建立 TLS 连接时,应用程序会立即启动。对于快速启动的应用程序,根据网络往返延迟,应用程序可能在客户端发送 HTTP 请求之前就已经运行。
-
文件系统访问针对常用启动文件进行了优化。Deno DeployEA 在构建步骤的预热阶段分析文件访问模式,并优化文件系统以实现更快的访问。
当冷启动缓慢时,可能会对用户体验产生负面影响。要优化您的应用程序以实现快速启动,请采取以下措施:
-
最小化应用程序使用的依赖项。
-
使用动态
import()
惰性加载不常访问的代码和依赖项。 -
最小化启动期间的 I/O 操作,尤其是顶层
await
操作和网络请求。
如果您的应用程序启动缓慢,请联系 Deno 支持以获取帮助调查此问题。