Google App Engine 在基本缩放上抛出错误

Posted

技术标签:

【中文标题】Google App Engine 在基本缩放上抛出错误【英文标题】:Google App Engine throws error on Basic Scaling 【发布时间】:2021-11-26 02:28:46 【问题描述】:

我正在为该项目使用 golang 和 Google App Engine。我有一个任务,我收到一个巨大的文件,将它分成几行,然后将这些行一一发送到队列中以进行解析。我在 app.yaml 文件中进行缩放的初始设置如下:

instance_class: F1
automatic_scaling:
  min_instances: 0
  max_instances: 4
  min_idle_instances: 0    
  max_idle_instances: 1
  target_cpu_utilization: 0.8
  min_pending_latency: 15s

它工作正常,但它有一个问题 - 因为确实有很多任务,10 分钟后它会失败(当然,根据文档)。所以我决定使用B1 实例类而不是F1 - 这就是问题所在。

我的 B1 设置如下所示:

instance_class: B1
basic_scaling:
  max_instances: 4

现在,我创建了一个非常简单的演示来演示这个想法:

r.GET("foo", func(c *gin.Context) 
        _, err := tm.CreateTask(&tasks.TaskOptions
            QueueID:  "bar",
            Method:   "method",
            PostBody: "foooo",
        )
        if err != nil 
            lg.LogErrorAndChill("failed, %v", err)
        
    )

    r.POST("bar/method", func(c *gin.Context) 
        data, err := c.GetRawData()
        if err != nil 
            lg.LogErrorAndPanic("failed", err)
        
        fmt.Printf("data is %v \n", string(data))
    )

解释其背后的逻辑:我向“foo”发送了一个请求,该请求创建了一个任务,该任务与一些正文一起添加到队列中。在任务内部,基于 queueIdmethod 参数调用 post 方法,该方法接收一些文本,在这个简单的示例中只是将其注销。

现在,当我运行请求时,我收到 500 错误,如下所示:

[GIN] 2021/10/05 - 19:38:29 | 500 |     301.289µs |         0.1.0.3 | GET      "/_ah/start"

在日志中我可以看到:

Process terminated because it failed to respond to the start request with an HTTP status code of 200-299 or 404.

并且在任务队列里面(重试的原因):

INTERNAL(13): Instance Unavailable. HTTP status code 500

现在,我已阅读文档并了解以下内容:

Manual, basic, and automatically scaling instances startup differently. When you start a manual scaling instance, App Engine immediately sends a /_ah/start request to each instance. When you start an instance of a basic scaling service, App Engine allows it to accept traffic, but the /_ah/start request is not sent to an instance until it receives its first user request. Multiple basic scaling instances are only started as necessary, in order to handle increased traffic. Automatically scaling instances do not receive any /_ah/start request.

When an instance responds to the /_ah/start request with an HTTP status code of 200–299 or 404, it is considered to have successfully started and can handle additional requests. Otherwise, App Engine terminates the instance. Manual scaling instances are restarted immediately, while basic scaling instances are restarted only when needed for serving traffic

但这并没有真正的帮助 - 我不明白为什么 /_ah/start 请求没有正确响应,我不确定如何调试或修复它,特别是因为 F1 实例正在工作好的。

【问题讨论】:

【参考方案1】:

对 url /_ah/start/ 的请求被路由到您的应用程序,而您的应用程序显然还没有准备好处理它,这会导致 500 响应。检查您的日志。

基本上,您的应用需要准备好接收带有 url /_ah/start/ 的请求(类似于准备处理对 url /foo/ 的请求的方式)。如果您在本地运行应用程序,请尝试打开此类 url(通过curl 等)并查看响应。它需要以响应代码 200–299 或 404 进行响应(如您引用的文本中所述),否则将不会被视为成功启动的实例。

【讨论】:

您好,感谢您的回复!禁用该服务是指将其从 app.yaml 文件中删除吗?或者应该添加一些代码行(目前我在 app.yaml 文件中没有关于预热的任何指令)。另外,您是指准备应用程序吗?是关于路由的吗? 编辑了我的答案,我混淆了/_ah/warmup//_ah/start/ 听从您的建议后,我得到了 301,这已经是一个不错的变化,将继续朝这个方向努力,谢谢!

以上是关于Google App Engine 在基本缩放上抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine 自动缩放如何工作?

您可以在基于 Cloud Pub/Sub 队列的 Google App Engine 中触发自动缩放吗?

为啥 Google 删除了运行 Python 3.7 的 App Engine 的 Image API?

将基本的 Angular 2 应用程序部署到 Google App Engine

基于“已用”内存的 Google Compute Engine 自动缩放

Google App Engine:在 Python 中使用自定义入口点