Google Cloud Function 由于没有可用实例,请求被中止

Gui*_*ume 9 http google-cloud-platform google-cloud-functions

在运行一些云函数时,我有时会收到错误:

"The request was aborted because there was no available instance."
Run Code Online (Sandbox Code Playgroud)

我看到其他问题也出现类似的错误,但对于 Cloud Run,您可以指定可用实例的数量,但 Cloud Function 似乎没有这样的事情。那么如何解决这个问题呢?

我可以在配额页面看到后台功能有限制,但 HTTP 功能没有限制。我通过 HTTP 调用 lambda 函数,它部署在us-central1

Tha*_*hai 5

此问题同时发生在Google Cloud FunctionsFirebase Cloud Functions上。我们 Taskworld 每天都会多次面临这个问题。人们在这里报告了可靠性问题,谷歌正在在这里跟踪这个问题。这些问题是最近出现的(在该问题发布到 StackOverflow 后大约 1\xe2\x80\x933 个月内创建。)

\n

我们通过混沌工程解决了这个问题。具体来说,我们将此代码添加到我们的函数 HTTP 端点中:

\n
  if (Math.random() < 0.1) {\n    res.status(500).send(\'firebase is funny\')\n    return\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

这实际上会导致 10% 的请求失败并显示 500 错误代码,这与 Cloud Functions 本质上无法管理流量速率时的行为相同。如此高的错误率迫使消费者建立弹性在客户端本身中

\n


Don*_*ndi 4

根据GCP 仪表板,当前区域us-central1europe-west1. 目前,我可以想到错误背后有两个原因:

  1. 持续存在的问题会产生间接影响,即当前没有实例可以处理该请求。
  2. 最初出现大量请求,以至于云功能无法足够快地扩展,尽管没有达到max_instances

#1 的解决方案是将您的函数暂时重新部署到另一个区域。#2 的解决方案是在函数中实现某种重试逻辑。请注意,自动重试在 HTTP 函数中不可用,因此您必须使用自己的逻辑来实现它。

如果它不适合您,那么还有另一种选择,可以使用 Cloud Tasks实现排队机制,以处理突发的流量并在请求失败时处理重试。