处理从 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
如何在 Google App Engine 标准环境中使用 Google Cloud Build 或其他方法设置环境变量?