我在Google Cloud上运行的一个ExpressJS应用程序上做负载测试,在流量激增的情况下,有一段时间我在Stackdriver中看到了500个错误,并显示消息“请求失败,因为实例无法成功启动。”--这实际上导致了服务器停机。
看到随着应用程序的扩展,这个错误发生的频率越来越高,我认为这是由于Cloud Run负载均衡器在这些实例准备接受请求之前过早地将流量分配给这些实例。
当我继续运行负载测试时,实例被连续且重复地终止和重启,因此在负载开启时没有恢复机制。
我没有从我的NodeJS应用程序中看到任何错误日志,这表明实际上没有失败的请求到达我的应用程序。
我能做些什么来避免这些错误?
Cloud Run如何确定端口是否已准备好接受请求?
是我在ExpressJS应用程序中配置错误了吗?还是我可以在向新实例发送请求之前以某种方式延迟一点云运行?
发布于 2019-11-17 05:25:03
事实证明,这是由Cloud Run自动伸缩最大实例限制和Cloud SQL连接限制的组合造成的。
我运行的是一个小型Cloud SQL Postgres实例(3.75 GB /1 vCPU),默认连接限制为100。(https://cloud.google.com/sql/docs/quotas)
默认情况下,Cloud Run为弹性伸缩分配的最大实例数为1000。在负载测试期间,请求数的突增推动弹性伸缩创建了数百个实例,很快就用完了100个云SQL连接的限制。
Cloud SQL:https://cloud.google.com/sql/docs/postgres/connect-run#connection_limits_3 (如果这也记录在Cloud Run上就更好了,当这个问题发生时,我没有立即想到去寻找关于Cloud SQL的文档)
解决方案是将Cloud Run上的最大实例数限制为可容忍的数量,并调整Cloud SQL上的资源分配/最大连接限制。确切的配置显然取决于预期的负载级别。
https://stackoverflow.com/questions/58811686
复制相似问题