我写了以下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的正确方法是什么?
答案 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)
为避免超时,请在Lambda的AWS上下文中将callbackWaitsForEmptyEventLoop
设置为false
。这样,您不必关闭redis连接,并且lambda不会等待它(或其他连接,即db连接)在返回之前关闭:
https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html