首页 > 解决方案 > Google App Engine (GAE) 基本扩展后端实例服务一个请求并取消部署

问题描述

我在 App Engine 中部署了一个应用程序(前端和后端)。首先,我使用的是免费层,我为前端选择了默认的 F1,为后端选择了 B2。我并不完全了解 B 和 F 实例之间的区别,但根据它们的名称,我分别选择它们作为后端和前端。

我的后端是一个 Flask 应用程序,它从 Firestore 上读取一些数据@app.before_first_request并为所有未来的请求“预缓存”它。这需要大约 20-30 秒才能提供第一个请求,所以我真的不希望后端实例一直处于未部署状态。

现在,我的后端成功地处理了一个请求(我从浏览器发出的请求),然后立即取消部署(基本上,在处理请求后,我在 App Engine 仪表板中看不到活动实例)。这意味着每个请求在服务器启动时再次具有我不想要的相同的长延迟。我不确定为什么会发生这种情况,因为我已将空闲超时设置为 5 分钟。我知道这不是我的 Flask 应用程序的问题,因为它不会在本地机器上发出请求后崩溃,而且我已经完成了它的内存分析,它在 B2 限制的范围内。这是我的后端 app.yaml:

runtime: python38
service: api
env_variables:
  PORT: 8080
instance_class: B2
basic_scaling:
  max_instances: 1
  idle_timeout: 5m

任何见解将不胜感激!

标签: flaskgoogle-app-enginegoogle-cloud-platform

解决方案


根据您所公开的信息和行为,请允许我向您解释这两种缩放模型的行为都符合它们的设计目的。

“自动扩展:它根据请求率、响应延迟和其他应用程序指标创建实例。您可以为这些指标中的每一个指定阈值,以及始终保持运行的最小实例数。

基本扩展:基本扩展仅在您的应用程序收到请求时创建实例。当应用程序空闲时,每个实例都将被关闭。基本扩展非常适合间歇性工作或由用户活动驱动的工作。”</p>

使用以下 URL 的文档作为这些模型的参考,其中更多的是如何管理实例

2021 年 10 月 12 日添加的信息:

你好,

我认为正确的术语是“关闭”而不是“未部署”禁​​用您的应用程序。查看实例状态“手动或基本扩展服务的实例可以运行或停止。相同服务和版本的所有实例共享相同的状态。” 然后查看缩放类型“基本扩展会在您的应用程序收到请求时创建实例。当应用程序空闲时,每个实例都将关闭。基本扩展非常适合间歇性或由用户活动驱动的工作。” 以及表的 Startup and shutdown row for basic scaling "实例根据idle_timeout配置参数按需创建处理请求并在空闲时自动关闭。手动停止的实例有30秒完成处理请求,然后强制执行终止。” 和缩减“您可以指定最小数量的空闲实例。根据请求量为您的应用程序设置适当数量的空闲实例,可以让您的应用程序以很少的延迟服务每个请求”。

能否请您验证:

  • 实例没有手动停止?
  • 那个实例变得空闲了?
  • 没有后台线程?
  • 如果将max_instances设置为 2 时功能相同
  • 没有显示实例关闭的日志
  • 他们正在达到更新了 idle_timeout 集的版本

推荐阅读