3

作为序言,我知道超过 1 分钟的 HTTP 请求是糟糕的设计,我将研究 Cloud Tasks,但我确实想弄清楚为什么会发生这个问题。

因此,如标题中所述,我对 Cloud Run 服务(完全托管)有一个简单的 API 请求,该请求需要超过 1 分钟的时间,该服务执行一些 DB 操作并生成 PDF 并将它们上传到 GCS。当我从客户端(浏览器)发出此请求时,它会在等待 1 分钟后始终返回 502 响应(可能来自 HTTP 负载均衡器):

502 错误

但是,当我查看日志时,请求已成功完成(大约 4 到 5 分钟):

请求日志

对于正在生成并上传到 GCS 的每个 PDF,我也会遇到这些“错误”之一,但从我读到的内容来看,这些不应该是真正的问题吗?:

沙盒错误

为了验证这不仅仅是应用程序代码或浏览器的一些超时问题,我在本地构建的随机 API 调用上放置了 5 分钟的睡眠,一切正常且花花公子。

我已将 Cloud Run 上的请求超时设置为最大值(15 分钟),将最大并发设置为默认 80,将 CPU 和 RAM 的数量分别设置为 2 和 2GB,并将 Fastify(node.js)服务器上的超时设置为 15 分钟出色地。此外,在我收到 502 错误时,我查看了日志并没有发现表明实例内存不足或任何其他错误的错误。最后,我还按照建议使用 strace 更深入地查看系统调用,以防万一那里出了什么问题,但从我所见,一切看起来都很好。

最后,我怀疑容器和网关/负载均衡器之间的路由存在一些奇怪的竞争条件,但我对 Knative(构建 Cloud Run 的基础上)几乎一无所知,所以这只是一种预感。

如果有人对为什么会发生这种情况有更多的想法,请告诉我!

4

0 回答 0