Cloud Run 完成,但 Cloud Scheduler 认为该作业已失败
Posted
技术标签:
【中文标题】Cloud Run 完成,但 Cloud Scheduler 认为该作业已失败【英文标题】:Cloud Run finishes but Cloud Scheduler thinks that job has failed 【发布时间】:2020-02-02 01:12:06 【问题描述】:我有一个 Cloud Run 服务设置,我有一个调用该服务端点的 Cloud Scheduler 任务。当任务完成(http 处理程序返回)时,我看到以下错误:
请求失败,因为与实例的 HTTP 连接出错。
但是,实际的处理程序返回 HTTP 200 并成功存在。有谁知道这个错误是什么意思,在什么情况下会出现?
我还附上了日志的屏幕截图。
【问题讨论】:
您能否详细说明您的云运行服务的性质?您如何发送 200 响应?您是否正在刷新/关闭连接? 这是一个简单的 go 应用,在请求结束时返回 200。大约需要 30 秒才能完成。我刚刚意识到我剪掉了包含状态代码的屏幕截图的右侧。上面日志中的第 4 行来自应用程序,并在请求结束时由应用程序中的日志记录中间件发出。这是一个 200 响应。然后它下面的行是 503,这看起来像是来自 Cloud Scheduler 服务的日志。我在另一个端点上运行了 Cloud scheduler,它成功了。该端点需要大约 8 秒才能完成。 同样的问题 我遇到了同样的问题,我也在使用 Go,而不是 Node.js 【参考方案1】:我在我的 FLASK 端点上运行了增量睡眠测试,它在 1 分钟、2 分钟和 10 分钟的等待时间内返回 200。通过 Cloud Scheduler 触发端点后,该作业仅在 10 分钟测试中失败。我发现这是导致失败的 Cloud Scheduler 作业的属性之一。以下解决了我的问题。
gcloud scheduler jobs describe <my_test_scheduler>
在那里,您会看到一个名为“attemptDeadline”的属性,默认设置为 180 秒。
您可以使用以下方法更新该属性:
gcloud scheduler jobs update http <my_test_scheduler> --attempt-deadline 1000s
参考:scheduler update
【讨论】:
【参考方案2】:您的工作需要超过 120 秒吗?我遇到了同样的问题,并发现 13 之前的节点版本有 120 秒 server.timeout 限制。我在 docker 上安装了节点 13,问题就消失了。
【讨论】:
如果你使用快递,你可以直接res.connection.setTimeout(0)
。
我在使用 go 应用时遇到了同样的问题【参考方案3】:
-
Google 前端 (GFE) 返回错误 503。 Cloud Run 服务存在暂时性问题,或者 GFE 已确定您的服务尚未准备好或无法正常工作。
在您的日志条目中,我看到一个 POST 请求。 7 毫秒后出现错误 503。这表明您的 Cloud Run 应用程序尚未就绪(处于由 Cloud Run 确定的就绪状态)。
一分八秒前,我看到了
ReplaceService
。这告诉我您的服务尚未处于运行状态,如果您稍后重试,您将看到成功。
【讨论】:
另外,当我的容器崩溃时,我有 503。可以贴一下云运行的日志吗?以上是关于Cloud Run 完成,但 Cloud Scheduler 认为该作业已失败的主要内容,如果未能解决你的问题,请参考以下文章
使用 OpenTelemetry 在 Google Cloud Run 上跟踪传播
如何检查正在运行的 Google Cloud Run 容器的实例数?
Terraform:Cloud Run 服务上的 Cloud Endpoints?