我的设想
我试图利用node.js的全局作用域初始化一次数据库连接,并在调用lambda函数时使用初始化的连接。
这可以节省大量资源和时间,因为打开数据库连接是一个漫长的过程:
// Global scope: Runs only once
const redis = require('redis');
const client = redis.createClient({ <HOST>, <PORT> });
// Function scope: runs per invocation
exports.handler = (event, context, callback) => {
do-something-with-redis
};
我的问题
可能会出现一些常见的连接错误
未初始化的连接:由于node.js是异步的,函数可能在
redis.create
返回之前开始执行代码,因此使用未初始化的连接。超时:如果由于某种原因连接尝试超时,函数将有一个错误的处理程序。
运行时错误:如果在代码执行期间发生连接错误,则以下调用将具有错误的处理程序。
我的问题
克服aws lambda函数使用的全局redis连接错误(初始化、超时和运行时)的正确方法是什么?
最佳答案
lambda函数被设计成无状态的,所以我不知道是否有一个最好的答案。关于lambda和rds有一个真正的helpful GitHub comment,但它主要适用。它提到,答案取决于它将提出多少请求。
不管怎样,this SO answer或多或少是我想要做的;尽管我更喜欢redis库的基于承诺的api。作者使用回调来处理未初始化的连接问题,方法是在尝试使用连接之前等待连接打开。你提出的另外两个问题也在这个答案中得到了处理。基本上:if (err) callback(err)
。
我的意思是,考虑到github注释消息来自aws的支持,您需要在处理程序内部建立连接,所以您最好只在那里进行连接,直到您确定需要perf boost。
我知道这并不能完全回答这个问题,但这个问题已经开放了几天了,我很好奇。没有什么比在网上犯错更能找到正确的答案…