我们使用 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.
我试过了:
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)
这更多的是一个猜测,而不是一个答案,但我会尝试重新部署您的 Cloud Run 服务并min-instances设置为1(或更多)。
这就是原因。
\n他们在Cloud Run 故障排除文档中写道(强调我的):
\n\n\n此错误也可能是由于流量突然增加、容器启动时间过长或请求处理时间过长导致的。
\n
您的 Cloud Run 服务从 CMS (Contentful) 接收 Webhook 事件。而且,正如您所写,这些更新相当零星。所以我认为您的情况可能与Medium 上的评论中描述的情况相同:
\n\n\n我测试了 \xe2\x80\x9cmax-instances: 2\xe2\x80\x9d ,结论是我得到了 429 \xe2\x80\x94 速率超出了来自 Google 前端代理的响应,因为没有容器正在运行。似乎非常低的实例数会从负载均衡器中完全取消注册您的服务,直到发出第二个请求为止。
\n
如果 Google Cloud 确实因未接收任何流量而完全取消注册您的 Cloud Run 服务,则使用至少一个容器实例重新部署该服务可以解决您的问题。另一种方法是每隔一段时间调用您的 Cloud Run 服务以保持“温暖”。
\n| 归档时间: |
|
| 查看次数: |
4708 次 |
| 最近记录: |