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

时间:2018-03-05 13:55:28

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

  • 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是否能够自行检测连接问题并自动生成新实例(使用自动扩展),而不是将更多流量引导到该实例?

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

1 个答案:

答案 0 :(得分:1)

App Engine已经内置了限制它在新单个实例旋转之前将发送给单个实例的请求数量。使用自动扩展时,默认值max_concurrent_requests为8,因此除非出现问题,否则您不太可能在单个实例上达到60个并发请求。

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