在AWS Lambda上处理未初始化或错误的Redis连接

Ada*_*tan 6 scope node.js aws-lambda

我的情景

我正在尝试利用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
};
Run Code Online (Sandbox Code Playgroud)

我的问题

可能会发生一些常见的连接错误

  • 未初始化的连接:由于Node.js是异步的,因此函数可能会在redis.create返回之前开始执行代码,因此使用未初始化的连接.
  • 超时:如果连接尝试因某种原因而超时,则该函数将具有错误的处理程序.
  • 运行时错误:如果在代码执行期间发生连接错误,则在调用之后将出现错误的处理程序.

我的问题

什么是克服AWS Lambda函数使用的全局Redis连接的错误(初始化,超时和运行时)的正确方法?

Sam*_* H. 0

Lambda 函数被设计为无状态的,所以我不知道是否有一个最佳答案。GitHub上有一条关于 Lambda 和 RDS 的评论非常有用,但它基本上适用。它提到答案取决于它将发出多少请求。

无论如何,这个答案或多或少是我会做的;尽管我更喜欢 Redis 库基于 Promise 的 API。作者通过使用回调等待连接打开后再尝试使用连接来处理未初始化连接问题。您提出的其他两个问题也在该答案中得到处理。基本上:if (err) callback(err)

我的意思是,鉴于 GitHub 评论消息来自 AWS 的支持,您需要在处理程序内部建立连接,因此您也可以那里执行此操作,直到您确定需要性能提升。

我意识到这并不能完全回答这个问题,但这个问题已经开放几天了,我很好奇。没有什么比在互联网上犯错更能找到正确答案的了……