使用RDS在AWS Lambda中建立连接池?

时间:2018-01-17 09:33:36

标签: mysql node.js aws-lambda connection-pooling

我需要在AWS Lambda中使用有效的MySQL数据库连接(使用Node Js)。

这不是为每个请求创建连接/池,而是重用它。

我得到的一个解决方案就像在AWS lambda处理程序外部打开连接一样。但是如果我们不结束连接这个问题,我们最终得到超时结果。 e.g。

Editor > Embed In > NavigationController

2 个答案:

答案 0 :(得分:1)

在AWS Lambda中处理数据库连接的最可靠方法是在调用本身内 connect disconnect ,这是您的代码已经在做的事情。< / p>

有许多方法可以重用现有连接,但成功率因数据库服务器配置(空闲连接等)和生产负载而有很大差异。

此外,在AWS Lambda的上下文中,由于在Lambda中扩展的工作方式,重用数据库连接并不会给您带来太多的性能优势。

例如,在永远在线的服务器应用程序中,并发和后续请求使用并共享相同的连接或连接池。

然而,在Lambda中,并发请求由不同的服务器处理,每个服务器都有自己的数据库连接。 10个并发请求将旋转10个连接到您的数据库的独立服务器。重用连接或连接池在这里没有任何帮助。

答案 1 :(得分:1)

要解决您的问题,请使用:

context.callbackWaitsForEmptyEventLoop = false;

发生超时的原因是由于处理程序外部的代码导致事件循环不为空。此更改允许回调以立即结束lambda的执行。您的完整代码如下所示:

var db = require('./db');
exports.handler = (event, context, callback) => {

    context.callbackWaitsForEmptyEventLoop = false;

    db.connect(function (conn) {
       // .. rest of your code that calls the callback
    });
}

有关更多信息,请查看Jeremy Daly的博客文章。

https://www.jeremydaly.com/reuse-database-connections-aws-lambda/