Google APP Engine - 为每个连接生成新实例或具有零个实例

Google APP Engine - spawns new instance for every connection or has zero instances

我注意到 Google App Engine 有点奇怪。如果我的应用程序还没有被使用过,我打开它,我注意到它需要一些时间来加载,我还在 GAE 日志控制台中看到它在这段时间启动了一个服务器,所以等待(为什么不总是有实例 运行?)

在我打开和关闭应用程序几次后,我注意到在 GAE 的版本选项卡中我有 7 个 运行 个实例(全部在同一版本中)。

我对 GAE 的工作方式有点困惑,当一段时间没有请求时,它是否会将您的实例减少到 0,然后在另一方面,它是否会为每个新客户端连接启动一个新实例?

我的 app.yaml 看起来像这样:

  runtime: nodejs10
  env: standard

  instance_class: F2

  handlers:
    - url: /.*
      secure: always
      redirect_http_response_code: 301
      script: auto    

由于您没有在 app.yaml 中指定任何缩放设置,App Engine 正在使用 automatic scaling

这意味着该应用程序有 0 minimum instances,因此当您的应用程序根本没有收到任何请求时,它将缩小到 0。使用该选项,您将节省意味着拥有一个实例的成本 运行 所有时间,但也会发生冷启动。每次请求到达您的应用程序时都会发生冷启动,但没有准备好为其提供服务的实例,因此必须创建一个新实例。

关于您的应用程序在流量负载增加时最多扩展到 7 个实例,这再次取决于接收的工作负载。您也可以使用 max_instances 设置来控制此行为,但如果需要更多实例,使用较低的值可能会影响应用程序的性能。

如果达到 target_cpu_utilizationtarget_throughput_utilizationmax_concurrent_requestsmax_pending_latencymin_pending_latency 上的阈值,App Engine 将启动新实例。您可以阅读所有这些内容 here.

您需要微调您的 App Engine 扩展策略,例如请查看此 app.yaml 文件

runtime: nodejs10
env: standard
instance_class: F2
handlers:
  - url: /.*
    secure: always
    redirect_http_response_code: 301
    script: auto

automatic_scaling:
  min_instances: 1
  max_instances: 4
  min_idle_instances: 1
  max_concurrent_requests: 25
  target_throughput_utilization: 0.8

inbound_services:
- warmup

min_instances & min_idle_instances 设置为 1,以便为传入请求准备好几乎 1 个实例并避免冷启动。

为避免启动新实例的速度过快,您可以设置 max_concurrent_requests & target_throughput_utilization,在此示例中,一个新实例将启动直到一个实例达到 20 个并发请求(25 X 0.8 )

如在您的申请中 document, it is necessary create a warmup endpoint 中所述,并在您的 app.yaml 文件中添加 inbound_services,例如:

app.get('/_ah/warmup', (req, res) => {
    // Handle your warmup logic. Initiate db connection, etc.
});

预热调用的好处是在传入请求之前准备您的实例并减少第一个请求的延迟。