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

标签 node.js scope 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
};

我的问题

可能会出现一些常见的连接错误

  • 未初始化的连接:由于 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/

相关文章:

node.js - Fb api发布共享图像链接显示空图像

c++ - 在 If 语句中分配变量 [C++]

amazon-web-services - 是否可以向使用 AWS Amplify 预置的 lambda PostAuthenticate 函数授予额外权限?

aws-lambda - 如何找到我的 lambda 所在的跟踪 ID?

php - 在函数和多个脚本 (PHP) 中使用单例数据库类 - 最佳使用方法

aws-lambda - 无服务器框架将 Lambda 添加到现有 VPC 和子网

javascript - 在 forEach 上通过引用传递

javascript - 如何使用 Express.js 将 API 访问限制为仅授权域?

javascript - 将 Webpack 语法转换为 browserify 语法

javascript - 从外部访问 JavaScript switch 语句内声明的变量