【问题标题】:High level question on mysql and connection pools (relating to AWS)关于 mysql 和连接池的高级问题(与 AWS 相关)
【发布时间】:2020-10-19 15:18:37
【问题描述】:

我目前正在使用 AWS lambda 连接到 AWS mysql RDS。我正在创建一个这样的池

   pool  = mysql.createPool({
     host     : 'host-details',
     user     : 'username',
     password : 'password',
     database : 'db'
   });

现在,当应用程序的用户“做某事”时,它基本上只是通过我的代码进行连接,从 db 表中抓取数据,然后释放连接。所以假设有 10 个用户,他们都同时“做某事”这是否意味着:

  1. 此池中将有 10 个连接,并且一旦连接释放,连接计数就会回到 0?如果是这样,这是否意味着这个池(即使它有 50 个连接的限制)可以支持数千个用户,因为数据库查询仅持续几毫秒?

  2. 查看 AWS 中的 RDS 监控,有一个“数据库连接(计数)”的指标。上述情况是否意味着它将保持 1 个连接,因为它是 1 个池,还是会飙升至 10 个连接?

  3. 据我了解,如果我的连接池限制为 8 个,并且出现上述情况,其他 2 个连接将排队。是什么阻止我将连接限制设置得非常高,这只是数据库可以处理的一个因素吗?即,如果我看到我的数据库内存/cpu 性能开始出现问题,我是否将池连接限制向后缩放?反之亦然。

为了解决这个问题,我试图了解这一切是如何工作的,以便我可以正确设置我的数据库/代码,这样一旦开始扩展,事情就不会中断。

谢谢。

【问题讨论】:

    标签: mysql amazon-web-services aws-lambda amazon-rds


    【解决方案1】:

    假设您在 Lambda 处理程序外部创建了池,该函数的每个实例都将创建自己的池。每当一个函数的请求进入时,如果没有该函数的 idle 实例,则会创建一个新实例。每个实例创建其单独的池。单个实例一次可以处理多个调用 1。单个实例的所有调用共享池。

    Q1的答案:

    是的,如果由这些用户触发的所有调用最终都由函数的单个实例(一次 1 个)处理,那么 1 个池可以支持 1000 名用户。

    Q2的答案:

    RDS 的数据库连接数指标将飙升至 10。它计算连接数。它不知道这些连接是否源自池。

    Q3的答案:

    根据您的数据库实例大小(CPU/内存)和您期望 Lambda 的流量来设置连接限制。因此,如果您的数据库一次可以处理 200 个连接并且您希望 1 个 Lambda 的 10 个实例同时运行(并且您总共只有 1 个 Lambda),请将池大小设置为 200/10 = 20。这是一个非常简单的方法计算。查询持续时间等许多其他因素都会影响这一点。

    有关所有这些的图片视图,请参阅my blog post

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2010-11-17
      • 2019-03-03
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多