我的场景
我正在尝试利用 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 函数被设计为无状态的,所以我不知道对此是否有最佳答案。真的有helpful GitHub comment关于 Lambda 和 RDS,但它主要适用。它提到答案取决于它将发出多少请求。
无论如何,this SO answer或多或少是我会怎么做;尽管我更喜欢 Redis 库的基于 Promise 的 API。作者通过使用回调等待连接打开后再尝试使用连接来处理Uninitialized Connection问题。您提出的其他两个问题也在该 SO 答案中处理。基本上:if (err) callback(err)
。
我的意思是,鉴于 GitHub 评论消息来自 AWS 的支持,您需要在处理程序内部建立连接,所以您也可以仅在那里进行连接,直到您确定需要性能提升。
我意识到这并不能完全回答问题,但这个问题已经开放几天了,我很好奇。没有什么比在互联网上犯错更能找到正确答案的了……
关于node.js - 在 AWS Lambda 上处理未初始化或错误的 Redis 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48137445/