如何修复CloudRun错误“由于没有可用实例,请求已中止”

时间:2019-07-12 12:51:43

标签: google-cloud-platform serverless google-cloud-run

我正在使用托管的CloudRun来部署具有concurrency=1的容器。部署后,我将并行触发四个长期运行的请求。 在大多数情况下,所有工作都很好-但偶尔,在几秒钟内,我会从其中一个节点面临500个问题;日志仅提供主题中提供的错误消息。

使用具有指数补偿的重试并不能改善这种情况;重试也以500s结束。 StackDriver日志也不提供更多信息。

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

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

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

4 个答案:

答案 0 :(得分:2)

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

通常在以下情况下发生

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

答案 1 :(得分:0)

我也尝试了这个问题。易于复制。我有一个在6s fibo(45)中处理的fibonacci容器。我使用Hey执行200个请求。然后将Cloud Run并发设置为1。

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

答案 2 :(得分:0)

我能够通过将最大自动缩放容器数从2增加到10来解决此问题。确实没有理由认为2对于流量而言甚至会太低,但是我怀疑有关Cloud的某些信息运行内部构件以某种方式捆绑了最多2个容器。

答案 3 :(得分:0)

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