如何修复 CloudRun 错误 'The request was aborted because there was no available instance'

How to fix CloudRun error 'The request was aborted because there was no available instance'

我正在使用托管 CloudRun 通过 concurrency=1 部署容器。部署后,我将同时发出四个 long-运行 请求。 大多数时候,一切正常——但偶尔,我会在几秒钟内面对来自其中一个节点的 500;日志仅提供主题中提供的错误消息。

使用指数退避重试并没有改善这种情况;重试也以 500 秒结束。 StackDriver 日志也​​不提供更多信息。

可能相关的 gcloud beta run deploy 个参数:

--memory 2Gi --concurrency 1 --timeout 8m --platform managed

错误消息的确切含义是什么 -- 我该如何解决这个问题?

当基础架构的扩展速度不足以赶上流量高峰时,就会出现此错误消息。 Infrastructure 只会将请求在队列中保留一定时间(大约 10 秒),然后中止它。

这通常发生在以下情况:

  1. 流量突然大幅增加
  2. 冷启动时间长
  3. 请求时间长

我也在试验这个问题。易于重现。我有一个在 6s fibo(45) 中处理的斐波那契容器。我使用 Hey 执行 200 个请求。我将 Cloud 运行 并发设置为 1.

超过 200 个请求我有 8 个类似的错误。就我而言:突然的流量高峰和较长的处理时间。 (对我来说是短暂的冷启动,它在 Go 中)

我能够通过将最大自动缩放容器数从 2 增加到 10 来解决我的服务中的这个问题。对于流量而言,2 几乎没有理由太低了,但我怀疑是关于Cloud 运行 内部结构以某种方式绑定了 2 个容器。

我们也遇到过这个问题,在工作时间流量突然增加。该问题通常是由于流量突然增加以及为适应传入请求而需要较长的实例启动时间引起的。处理此问题的一种方法是始终保持预热实例 运行ning,即在云 运行 部署命令中配置 --min-instances 参数。另一种推荐的方法是减少服务冷启动时间(这在某些语言中很难实现,例如 Java 和 Python)