重用NodeJS Lambda函数的Redis连接

时间:2017-10-17 15:21:06

标签: node.js lambda redis

我写了以下Lambda函数:

exports.handler = (event, context, callback) => {
    const redis = require('redis');
    const redis_client = redis.createClient({
        host: 'hostname',
        port: 6379
    });

    redis_client.set("foo", "bar");

    redis_client.get("foo", function(err, reply) {
        redis_client.quit();
        callback(null, reply);
    });
};

这很好用。但是,我想重用Lambda调用之间的Redis连接来提高性能。理论上,这可以通过将createClient()移动到处理程序之外来实现。但是,由于" redis_client.quit()"线,该连接被杀死。如果我不退出客户端,Lambda函数会超时。

使用AWS Lambda时在NodeJS中重用Redis的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

正如您已经提到的,您的方法是正确的,但您必须记住,您的Redis实例具有连接限制,例如AWS Elasticache maxclients设置为65000. AWS当前允许并行执行1k Lambdas,因此小心外部连接。

目前,Lambda外部数据库连接没有灵丹妙药。一种可能的解决方案是创建内部Web API服务,该服务处理DB之间的通信。

答案 1 :(得分:2)

要重用Redis客户端连接,请将其定义为处理程序外的全局。

const redis = require('redis');
const redis_client = redis.createClient({
    host: 'hostname',
    port: 6379
});

exports.handler = (event, context, callback) => {
    redis_client.set("foo", "bar");

    redis_client.get("foo", function(err, reply) {
        redis_client.unref();
        callback(null, reply);
    });
};

答案 2 :(得分:0)

为避免超时,请在L​​ambda的AWS上下文中将callbackWaitsForEmptyEventLoop设置为false。这样,您不必关闭redis连接,并且lambda不会等待它(或其他连接,即db连接)在返回之前关闭:

https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html