处理从 App Engine 标准环境到 Cloud SQL 的每个应用实例的 60 个并发连接限制的最佳方法?

Posted

技术标签:

【中文标题】处理从 App Engine 标准环境到 Cloud SQL 的每个应用实例的 60 个并发连接限制的最佳方法?【英文标题】:Best way of dealing with limit of 60 concurrent connections per app instance from App Engine standard environment to Cloud SQL? 【发布时间】:2018-08-13 04:51:03 【问题描述】: App Engine Python 标准环境(线程安全) Cloud SQL mysql 第二代 所有请求处理程序都需要数据库并且是面向用户的 没有 ORM,只有简单的 SQL

根据Cloud SQL: Pricing and Access Limits,对于我们的机器类型 Cloud SQL 的限制为每个应用最多 4,000 个并发连接,更重要的是,在我们的案例中,从 App Engine 标准环境连接时,限制为每个应用实例最多 60 个并发连接到 Cloud SQL 实例。 (其他限制不接近成为瓶颈)

最可能的瓶颈是每个应用实例最多 60 个并发连接。我没有可用的数字,所以我不确定单个应用程序实例 (F1/B1) 是否可以同时为 60 多个用户提供服务(可能不会)。

当前代码确保为每个请求(需要数据库的地方)创建一个连接并最终关闭(即使之前发生异常也是如此。根据情况,连接可能会更早关闭。我不确定如果这是最好的方法。从webapp2.RequestHandler 类调用的简化函数:

def handle_FAW_Request_approve(reqh, ref):
    try:
      conn = connect_to_cloudsql()
      # do queries, maybe updates
      # eventually conn.close() earlier if database not needed anymore
      # do something else
      # return response
    finally:
        try:
            conn.close()
        except Exception as err:
            # connection never existed or already closed
            pass

对此question 的回答提出了一种(线程安全的)方法来重用数据库连接(或游标)。我认为这将有助于节省因打开/关闭连接的任何开销而损失的时间,但不能保证应用程序实例将保持在连接限制内,对吧?

App Engine 是否能够自行检测连接问题并自动生成新实例(具有自动缩放功能),而不是将更多流量导向该实例?

还是应用程序需要自己处理限制?通过超出给定限制,避免随机发生面向用户的服务器错误的解决方案是什么?

【问题讨论】:

使用自动缩放,默认 max_concurrent_requests 为 8,因此您不太可能遇到并发连接限制问题。 @Vadim 我忘记了用于自动缩放的max_concurrent_requests。那确实会有所帮助。谢谢! (PS:我会接受你的评论作为答案。) 【参考方案1】:

App Engine 已对在启动新实例之前向单个实例发送多少请求进行了限制。使用自动扩展时,max_concurrent_requests 的默认值为 8,因此除非真的出现问题,否则您不太可能在单个实例上达到 60 个并发请求。

您还应该考虑提高max_concurrent_requests 的值,因为您可以从单个实例中获得比 8 个请求更多的信息。

【讨论】:

以上是关于处理从 App Engine 标准环境到 Cloud SQL 的每个应用实例的 60 个并发连接限制的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot GCP:将 PubSub 应用程序部署到 App Engine 标准环境时出现“Google 凭据”异常

如何使用App Engine上的Python标准环境连接到Cloud SQL上的Postgres

App Engine标准环境中的Python 3快速入门

如何在 Google App Engine 标准环境中使用 Google Cloud Build 或其他方法设置环境变量?

我如何从Google App Engine中触发一个HTTP云函数?

如何将私有、自托管的 NPM 包与 Google App Engine 节点、标准环境一起使用