我正在Google Cloud Run上托管的ExpressJS应用上进行负载测试,当流量激增时,有一段时间我在Stackdriver中看到许多500错误,并显示消息“请求失败,因为实例无法启动。成功。” -有效导致服务器停机。
看到此错误会随着应用程序的扩展而更频繁地发生,我认为这是由Cloud Run负载平衡器在这些实例准备好接受请求之前过早地将流量分配给新实例造成的。
当我继续运行负载测试时,实例会不断重复被杀死并重新启动,因此在负载打开时没有恢复机制。
我没有从NodeJS应用程序中看到任何错误日志,表明没有任何失败的请求实际上到达了我的应用程序。
如何避免这些错误?
Cloud Run如何确定端口已准备好接受请求?
是我在ExpressJS应用中配置错误的东西,还是可以在将请求发送到新实例之前以某种方式延迟Cloud Run?
答案 0 :(得分:5)
这是由Cloud Run自动扩展最大实例限制和Cloud SQL的连接限制共同引起的。
我正在运行一个小型Cloud SQL Postgres实例(3.75 GB / 1 vCPU),其默认连接限制为100。(https://cloud.google.com/sql/docs/quotas)
默认情况下,Cloud Run为自动扩展分配最大实例数1000。在负载测试期间,请求计数的突然增加促使自动扩展创建了数百个实例,这很快耗尽了Cloud SQL连接限制100。
已针对Cloud SQL:https://cloud.google.com/sql/docs/postgres/connect-run#connection_limits_3记录了这种确切的情况(如果在Cloud Run上也记录了这一点,那就太好了,发生此问题时,我并没有立即想到在Cloud SQL上寻找文档)
该解决方案是将Cloud Run的最大实例数量限制为可容忍的数字,以及调整Cloud SQL的资源分配/最大连接限制的组合。确切的配置显然取决于预期的负载水平。