从 Google Cloud Run 服务中的 docker 容器到 Google Cloud SQL 的请求最多需要 2 分钟

Posted

技术标签:

【中文标题】从 Google Cloud Run 服务中的 docker 容器到 Google Cloud SQL 的请求最多需要 2 分钟【英文标题】:Requests from docker container in Google Cloud Run Service to Google Cloud SQL takes up to 2 minutes 【发布时间】:2021-07-11 06:26:37 【问题描述】:

我正在使用 Google Cloud Run 服务将我的 Spring 应用程序托管在 docker 容器中。数据库在 Google SQL 服务中运行。我的问题是从应用程序到数据库的请求最多可能需要 2 分钟。请参阅Google Cloud Run log(长请求被涂成黄色)。这是Dockerfile 和Docker Compose File

数据库非常空,它包含大约 20 个表,但每个表只包含几行,所以没有请求大于几 kB。更奇怪的是,在重新部署应用程序后,请求又很快了。但是在几分钟、几小时甚至一整天之后,请求又变慢了。当我在本地机器上启动应用程序时,请求总是很快(对我的本地 SQL 和 Google SQL 实例),从来没有任何慢速连接。我的应用程序中不需要任何数据库请求的所有操作仍然很快,只需几毫秒。

两个服务都在同一个区域(欧洲西部)运行,并且运行服务的 CPU 使用率从未高于 15%,Google SQL 的 CPU 使用率从未高于 3%。 Google SQL 使用 1 个 CPU 和 3.75GB,Google 运行服务有 4GB RAM 和 2 个 CPU。但是增加 Google Run Service 和 Google SQL 的功能并不能改善请求延迟。 Google Cloud SQL 使用的是 mysql 5.7(就像我的本地数据库一样)。

在查看日志后,filtered Google SQL log 中仅显示警告(我真的不知道为什么会发生这种情况)。此外,这是Spring config 中的我的数据库连接设置。但我不认为这有任何影响,当我的本地应用程序连接到我的本地 SQL 实例或 Google SQL 实例时,该配置完美运行。

但也许你们中的一个人有一个想法?

【问题讨论】:

你能在你的数据库与 Spring 的连接上设置一个超时吗?比方说,10s,看看它是否更好。 不只是你 Markus,Cloud Run 和 Cloud SQL 之间的延迟经常会无缘无故地进入疯狂的高数字。 19 日,我们的延迟随机峰值持续了大约 15 分钟。对于解决这个问题,我和你一样好奇。 您是否已经尝试使用不同的数据库连接方法?例如。通过 vpc 连接器或公共 ip,而不是使用本机云运行 sql 连接器。 @Stefano 通过公共 IP 它可以正常工作,但我为 Google Cloud Run 服务付费,所以它也应该通过它工作。谷歌不能接受他们随机减慢连接速度(或导致此问题的原因)。似乎只是 Google Run/App Engine 和 Google SQL 之间的问题 【参考方案1】:

虽然不是一个真正的答案,但在 Google 上提交了一个错误来跟踪该问题: https://issuetracker.google.com/issues/186313545

这确实损害了我们的客户体验,并使我们对云运行的服务质量失去了信任。如果 Google 没有反馈来了解他们是否正在解决这个问题,那就更是如此。


编辑:

根据https://issuetracker.google.com/issues/186313545中的互动,现在问题似乎已经解决了

【讨论】:

感谢问题跟踪器的链接。从没想过这会是一个广泛的问题。我希望谷歌愿意解决这个问题!听起来这会影响更多的项目...... 看起来问题已解决。如果它不适合你,我建议你直接在Issue tracker 上发布。

以上是关于从 Google Cloud Run 服务中的 docker 容器到 Google Cloud SQL 的请求最多需要 2 分钟的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Run 中的 docker-compose.yml

从 Google Cloud Run 托管应用程序触发的 Pub/Sub 消息需要很长时间

Google Cloud Run 身份验证服务到服务

Google Cloud Tasks 无法向 Cloud Run 进行身份验证

如何获取或生成Google Cloud Run服务的部署URL

将 env 变量从 Google 的 Secret Manager 加载到在 Google Cloud Run 上运行但未通过 Cloud Build 部署的 Docker 容器中?