【问题标题】:Why does "communication link failure" occur with App Engine + Google Cloud SQL?App Engine + Google Cloud SQL 为什么会出现“通信链路故障”?
【发布时间】:2019-08-27 15:13:47
【问题描述】:

我注意到我们在使用 Google App Engine 和 Google Cloud SQL 时经常收到“通信链路故障”消息。当我们的 App Engine 应用程序进入休眠状态然后需要唤醒时,尤其会发生这种情况。这种情况在我们的测试服务器上发生得更频繁(与我们的生产环境相比,它可能更经常被闲置)。

我们最近切换到 MySQL 2nd Gen (v5.7)。我认为这可能会缓解问题,因为第 2 代实例仍然处于活动状态(即激活策略 = 始终开启)。但我们仍然收到“通信链路故障”错误。

我们最近也开始使用 Hikari 连接池。发生同样的错误,它被 HikariCP 捕获。

【问题讨论】:

标签: mysql google-app-engine google-cloud-sql


【解决方案1】:

此问题可能有多个根本原因,包括与实例的连接数、网络、防火墙配置或应用程序源代码。首先要验证的是与实例的连接数。看看这个很好的指导答案 [1]。

您可以为 Cloud SQL 实例 [2][3] 配置“wait_timeout”标志。由于您使用的是 App Engine Standard 并提到您的应用在较长时间不活动后进入休眠状态,因此在发送第一个请求时有一个启动过程需要一些时间,并且您的 Cloud SQL 实例可能没有等待足够长的时间那个过程来完成。

[1]https://stackoverflow.com/a/10772407/5921021
[2]https://cloud.google.com/sql/docs/mysql/flags#list-flags
[3]https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_wait_timeout

【讨论】:

  • 问题不是#1。 GAE 应用程序启动后,连接字符串起作用。它只是在 GAE 启动后第一次超时。等待超时设置为默认值,我认为是 30 分钟。我认为 GAE 关闭(由于不活动)不到 30 分钟。这将杀死整个应用程序,包括连接池。所以我不认为这是等待超时。可能是HikariCP连接超时时间太短(默认30秒),GAE启动时间超过30秒。
  • GAE 的启动时间通常少于 30 秒。您可以通过转到 Stackdriver 日志记录 [1] 并使用过滤器“protoPayload.wasLoadingRequest=true”搜索请求,在您的特定情况下准确查找多少。这是一个加载请求,随附的“protoPayload.latency”将显示启动所需的时间。日志历史记录还可能揭示导致通信链路故障的事件链,因此值得研究。
  • 我建议查看这个示例 [2],它使用与您的用例相同的组件:App Engine、Cloud SQL、Hikari。如果您成功部署此示例并且没有遇到“通信链路故障”,请将其配置和代码与您自己的配置和代码进行比较,以找出任何潜在的罪魁祸首。此外,在管理 Cloud SQL [3] 的数据库连接时,这里有一些重要的概念。
【解决方案2】:

我尝试过的两件事似乎有效。

首先,我误以为我们正在连接到第二代 MySQL 实例。我们实际上仍在连接到第一代实例。这些实例在一段时间后进入休眠状态,这可能导致连接池超时。

我将连接超时从 30 秒增加到 60 秒。

我不确定其中哪些消除了超时。但是我们现在很少遇到超时了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2012-05-27
    • 2018-02-17
    • 2012-10-14
    • 2011-08-12
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多