实例的管理方式

实例是 App Engine 用于自动扩缩应用的计算单元。在任何给定的时间,您的应用都有可能在一个或者许多实例上运行,传入的请求会分配到所有这些实例。

采用手动扩缩的实例应该无限期运行,但无法保证正常运行时间,因为实例可能会因故障或更新重启而提前终止。硬件或软件故障可能会毫无征兆地出现,导致实例提前终止或频繁重启,这些故障可能需要相当长的时间才能解决。

如果有可用的更新,则柔性环境下的所有实例都会每周重启。不过,我们不保证此时间表一定会按期执行。重启期间,在有向后兼容的关键补丁时,底层操作系统会自动更新。应用的映像将保持不变,而不会受重启影响。

健康检查

App Engine 会定期发送健康检查请求,以确认实例正在运行,并检查实例是否已完全启动并准备好接受传入请求。这些健康检查默认启用,称为分组健康检查。收到健康检查的实例必须在指定的时间间隔内响应健康检查。

如果您需要将分组健康检查的默认行为扩展到您的应用,可以自定义 app.yaml 文件以配置两种类型的健康检查:

  • 活跃性检查检测虚拟机实例及其容器是否正在运行。如果虚拟机实例未通过活跃性检查,该实例将自动重启。配置的阈值和时间间隔或者容器崩溃可能会导致活跃性检查失败。
  • 就绪性检查检测虚拟机实例是否准备好接受传入请求。如果虚拟机实例未通过就绪性检查,则表示该虚拟机实例尚未完成启动并且未准备好接收请求。如果虚拟机实例通过就绪性检查并完成启动,则会被添加到可用实例池中。

如需详细了解分组健康检查行为,请参阅迁移到分组健康检查指南。

在实例进行这些健康检查时,App Engine 日志可能表明实例处于以下任何状态:

  • Healthy。实例收到健康检查请求,并且正在处理请求。运行状况良好表示实例具有超过 820 MB 的磁盘可用空间,应以 HTTP 状态代码 200 响应健康检查。
  • Unhealthy。实例拒绝了健康检查请求,并且未能响应指定数量的连续健康检查请求。如果实例仍然无法响应健康检查并且连续失败次数达到预定值,App Engine 会继续发送健康检查请求并重启该实例。
  • Lameduck。实例将关停或重启。在关停期间,实例会完成正在进行的请求,并拒绝新请求。应用返回 503 代码以表明实例无法处理请求。在实例关停或重启之前,关停脚本的运行时间有限,并且不能配置为更短或更长时间。
  • App Lameduck。实例正在准备处理流量。应用返回 503 代码以表明实例无法处理请求。如果虚拟机实例已完成启动并准备好处理流量,该实例将变为运行状况良好并将处理请求。如果虚拟机实例未及时启动,该实例将变为运行状况不佳并被移除。

lameduck 和 app lameduck 行为都是虚拟机实例经历的正常过程的一部分。

监控资源使用量

通过 Google Cloud 控制台的“实例”页面,您可以了解实例的运行情况。该页面会提供每个实例的内存和 CPU 用量、正常运行时间、请求数及其他统计信息。您也可以对任何实例手动启动关停过程。

NTP 与 App Engine 柔性环境

App Engine 柔性环境具有使用 Google NTP 服务器的网络时间协议 (NTP) 服务。但是,柔性环境中的 NTP 服务无法修改。

实例位置

实例根据项目设置按地理区域自动定位。

实例扩缩

当应用正在运行时,传入请求将被路由到适当的服务/版本的现有实例或新实例。每个活跃版本必须至少运行一个实例,服务/版本的扩缩类型控制着额外实例的创建方式。 您可以在应用的 app.yaml 中指定扩缩类型。 默认情况下,您的应用使用自动扩缩功能,这意味着 App Engine 将管理空闲实例的数量。

自动扩缩
自动扩缩会根据请求速率、响应延迟时间和其他应用指标来创建实例。您可以配置 automatic_scaling 元素为其中的每个指标指定阈值,以及指定应始终保持运行的最小实例数。
手动扩缩
手动扩缩会指定无论负载水平如何都持续运行的实例数。这种类型支持复杂初始化等任务,以及持久依赖内存状态的应用。