AWS lambda和数据库

时间:2018-12-30 01:04:01

标签: aws-lambda connection-pooling

我从理论上一直学到,与数据库建立新连接是昂贵的操作。因此,我们应该保持开放的连接池并将其用于数据库操作。

在考虑AWS lambda时。假设lambda函数要在db上运行,那么我们需要创建与db的连接。操作后,需要关闭数据库。如果同时执行100个lambda函数,则将完成100个数据库连接打开/关闭。从理论上讲,这是错误的模式。

如果是这样,那么在涉及数据库操作时使用AWS lambda是否不合适?

2 个答案:

答案 0 :(得分:1)

连接池在无服务器上正常工作 即

const mysql = require('mysql');
const pool = mysql.createPool({
    host: {Your Host},
    user: {Your Username},
    password: {Your Password},
    database: {Your Database},
    port: 3306
});
exports.main = function main (req) {
  let query = ""
  return new Promise(function(resolve, reject){
    return resolve({
      statusCode: 200,
      body: "Success"
    });
         })
}

答案 1 :(得分:1)

为什么您需要关闭DB连接,而不在Lambda函数中重用它?

每运行Lambda个函数意味着一个Container,它们在运行后会存活一段时间(大约10分钟,如果您连续调用它,它将保持存活)。

保持活动状态意味着每个Lambda函数在运行后都会保留其内存区域,以便可以重用它们。

例如,如果您在Lambda函数中定义一个全局变量,如下所示。 (尽管它是python代码,但我认为您可以理解,因为它非常简单)

variable = 10

def lambda_function(event, context):
    global variable
    print(variable)  
    variable += 1

如果每1秒钟调用一次Lambda函数,它将如下所示打印。

10
11
12
13
14
.
.
.

如您所见,每个调用的Lambda函数都使用相同的全局变量。 如果全局变量是数据库连接怎么办?您可以重用它们,而不必在每次lambda调用时重新打开连接。

但是,正如您所说,如果同时执行100个Lambda函数,由于每个Lambda并发分别意味着不同的Containers并具有不同的存储区域,因此将打开100个连接。

但是最终,将重复使用100个连接以连续执行100个同时

----------编辑----------

我同意@Arun的评论。当流量稳定且逐渐增加和减少时,我的答案将很有用,这样连接可以被服务器端的保持活动充分复用和关闭。流量的急剧增加和减少可能浪费数据库连接,无法正确关闭。