在连接到Cloud sql -2nd Gen Mysql实例时,为什么App引擎(python3-标准环境)会生成异常终止的连接?

时间:2019-05-30 16:38:11

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

我目前正在使用python 3.7,Django 2.1,Mysql作为数据库开发项目。

我正在将其部署在Google Cloud App Engine标准环境中,对于数据库,我正在使用Cloud SQL-MySql第二代实例。

该应用程序运行良好,但是当我分析日志时看到以下错误:

  

“连接中断-读取通信数据包时出错”

在这种情况下,连接被我的应用程序(django)关闭。如果我将我的应用程序配置为具有持久连接,并且在cloud sql的配置中放置了wait_timeout(即60),则错误为:

  

“连接中断-读取通信数据包超时”。

我刚刚确定这不是sql cloud或应用程序配置问题,而是应用程序引擎问题。我通过以下方式得出这个结论:

  • 如果我通过My​​sql工作台连接到sql云实例,则不会终止任何连接
  • 类似地,如果我在本地服务器上运行我的应用程序,但是(通过cloud_sql_proxy)连接到云sql,则不会产生错误,并且一切正常。

所以我的结论是,这是应用程序引擎如何连接到云sql实例的问题。

为什么会这样?怎么解决?

2 个答案:

答案 0 :(得分:0)

我认为这是因为App Engine应用程序对Cloud SQL的请求受以下时间和连接limits的约束:

  • 对于在App Engine标准环境中运行的应用程序,所有数据库请求都必须在HTTP请求计时器内完成(大约60秒)。对于在灵活环境中运行的应用,所有数据库请求都必须在60分钟内完成。
  • cron任务之类的脱机请求的时限为10分钟。
  • 根据App Engine模块的缩放类型以及实例在内存中的保留时间(驻留时间),对Cloud SQL的请求会受到限制。
  • 在标准环境中运行的每个App Engine实例与Cloud SQL实例的并发连接不能超过60个。对于使用Java 8或Go 1.8编写的应用程序,限制为100。
  • Connection Issues:如果看到包含“到db:的连接nnnn异常终止”的错误,则通常表明您的应用程序未正确终止连接。也可能是由网络问题引起的。此错误并不表示您的Cloud SQL实例有问题。

答案 1 :(得分:0)

您看到的“中止连接”消息通常是在连接关闭不当或服务器与客户端之间存在网络异常时触发的。

  • 有时Cloud SQL实例和GAE具有长期空闲的连接。为了解决此问题,建议您在600秒以下设置“ wait_timeout”标记-您已经尝试过这样做。

  • 另一种可能的解决方案是实现应用程序级的keepalive。 SQLAlchemy为此提供了“ pre-ping”。否则,通过发送简单的SQL语句(例如“ SELECT 1;”)在所有打开的连接上生成活动。定期,至少每5分钟一次。还可以考虑在代码中使用“ with db.connect() as conn:”之类的语句来控制连接的生存期。