429 速率无明显原因超出响应

Jan*_*erg 16 google-cloud-run

我们使用 Contentful 来管理 CMS 内容。当您在 Contentful 中保存内容时,它会发送我们在 Cloud Run 上设置的服务的 Webhook,这反过来又确保构建和部署更新的内容。

之前的设置将 Cloud Run 服务限制为最多 1 个容器,并发请求数限制为 80 个。这对于我们偶尔获得的少数 webhook 来说应该足够了。

现在,当调试有关内容未更新的投诉时,我遇到了一个非常持久且令人恼火的问题 - Google Cloud Run 不会尝试处理 Contentful 发送的 2 个 Webhook,而是使用状态和响应正文响应这 2 个 Webhook429之一Rate exceeded.

此响应不是来自我们的后端,我可以在 Cloud RunLogs选项卡中看到 Google 生成的消息:The request was aborted because there was no available instance.

我试过了:

  • 将容器上的进程数量从 1 个增加到 2 个 - 由于使用了异步框架,因此没有必要
  • 容器数量从 1 个增加到 2 个

Contentful 的 webhook 仍然存在此问题。

如果我尝试从本地计算机发出请求hey(默认为 200 个请求、50 个并发),它们都会通过且不会429返回任何状态代码。

当特定客户端(在本例中为 Contentful)快速连续仅发出 2 个请求时,会发生什么情况会生成429状态代码?我们如何禁用或绕过这种行为?

gcloud run services describe <name>给我这些部署的详细信息:

+ Service [redacted] in region europe-north1

URL:     https://[redacted].a.run.app
Ingress: all
Traffic:
  100% LATEST (currently [redacted])

Last updated on 2021-01-19T13:48:46.172388Z by [redacted]:
  Revision [redacted]
  Image:            eu.gcr.io/[redacted]/[redacted]:c0a2e7a6-56d5-4f6f-b241-1dd9ed96dd30
  Port:             8080
  Memory:           256Mi
  CPU:              1000m
  Service account:  [redacted]-compute@developer.gserviceaccount.com
  Env vars:
    WEB_CONCURRENCY 2
  Concurrency:      80
  Max Instances:    2
  Timeout:          300s
Run Code Online (Sandbox Code Playgroud)

jac*_*dbd 0

这更多的是一个猜测,而不是一个答案,但我会尝试重新部署您的 Cloud Run 服务并min-instances设置为1(或更多)。

\n

这就是原因。

\n

他们在Cloud Run 故障排除文档中写道(强调我的):

\n
\n

此错误也可能是由于流量突然增加、容器启动时间过长或请求处理时间过长导致的。

\n
\n

您的 Cloud Run 服务从 CMS (Contentful) 接收 Webhook 事件。而且,正如您所写,这些更新相当零星。所以我认为您的情况可能与Medium 上的评论中描述的情况相同:

\n
\n

我测试了 \xe2\x80\x9cmax-instances: 2\xe2\x80\x9d ,结论是我得到了 429 \xe2\x80\x94 速率超出了来自 Google 前端代理的响应,因为没有容器正在运行。似乎非常低的实例数会从负载均衡器中完全取消注册您的服务,直到发出第二个请求为止。

\n
\n

如果 Google Cloud 确实因未接收任何流量而完全取消注册您的 Cloud Run 服务,则使用至少一个容器实例重新部署该服务可以解决您的问题。另一种方法是每隔一段时间调用您的 Cloud Run 服务以保持“温暖”。

\n

  • 您以某种方式解决了这个问题吗? (2认同)