500 on Google Cloud 运行: 请求失败,因为实例无法成功启动

500 on Google Cloud Run: The request failed because the instance could not start successfully

我正在对托管在 Google 云 运行 上的 ExpressJS 应用程序进行负载测试,当流量激增时,有一段时间我在 Stackdriver 中看到许多 500 错误并显示消息"The request failed because the instance could not start successfully." - 这实际上会导致服务器停机。

看到这个错误随着应用程序的扩展而更频繁地发生,我认为这是由于云 运行 负载均衡器在这些实例准备好接受请求之前过早地将流量分配给新实例造成的.

随着我继续运行负载测试,实例不断地重复被终止和重启,所以在负载开启时没有恢复机制。

我没有从我的 NodeJS 应用程序中看到任何错误日志,这表明 none 失败的请求实际上到达了我的应用程序。

我该怎么做才能避免这些错误?

Cloud 运行 如何确定端口已准备好接受请求?

是我在我的 ExpressJS 应用程序中配置错误还是我可以在向新实例发送请求之前以某种方式延迟 Cloud 运行 一点?

这原来是由 Cloud 运行 自动缩放最大实例限制和 Cloud SQL 的连接限制共同造成的。

我是 运行 一个小型 Cloud SQL Postgres 实例 (3.75 GB / 1 vCPU),默认连接限制为 100。(https://cloud.google.com/sql/docs/quotas)

默认情况下,Cloud 运行 为自动缩放分配的最大实例数为 1000。在负载测试期间,请求数的突然飙升促使自动扩展创建了数百个实例,这很快耗尽了云 SQL 100 的连接限制。

Cloud SQL 中记录了这个确切的场景:https://cloud.google.com/sql/docs/postgres/connect-run#connection_limits_3(如果 Cloud 运行 上也记录了这一点就好了,我没有立即想到要看出现此问题时,有关 Cloud SQL 的文档)

解决方案是结合限制云上的最大实例数 运行 一个可以容忍的数字,并调整云上的资源分配/最大连接限制 SQL。确切的配置显然取决于预期的负载水平。