在 AWS Lambda 上处理未初始化或错误的 Redis 连接
Posted
技术标签:
【中文标题】在 AWS Lambda 上处理未初始化或错误的 Redis 连接【英文标题】:Handling uninitialized or erroneous Redis connection on AWS Lambda 【发布时间】:2018-06-16 16:09:37 【问题描述】:我的场景
我正在尝试利用 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 连接的错误(初始化、超时和运行时)的正确方法是什么?
【问题讨论】:
似乎命令在断开连接时排队并在(重新)连接后重播。否则,您可以使用client
发出的事件。 github.com/NodeRedis/node_redis#connection-and-other-events
【参考方案1】:
Lambda 函数被设计为无状态的,所以我不知道是否有一个最佳答案。有一个关于 Lambda 和 RDS 的真正 helpful GitHub comment,但它主要适用。它提到答案取决于它将提出多少请求。
无论如何,this SO answer 或多或少是我的做法;虽然我更喜欢 Redis 库的基于 Promise 的 API。作者通过使用回调来处理未初始化的连接问题,以等待连接打开后再尝试使用连接。您提出的其他两个问题也在那个 SO 答案中处理。基本上:if (err) callback(err)
.
我的意思是,鉴于 GitHub 评论消息来自 AWS 的支持,您需要在处理程序内部建立连接,所以您也可以仅在那里进行操作,直到您确定需要性能提升。
我意识到这并不能完全回答这个问题,但这个问题已经开放了几天,我很好奇。没有什么比在互联网上犯错更能找到正确答案的了……
【讨论】:
以上是关于在 AWS Lambda 上处理未初始化或错误的 Redis 连接的主要内容,如果未能解决你的问题,请参考以下文章
使用 API Gateway 处理 AWS Lambda 函数中的错误
AWS lambda 函数-“发生错误:收到来自 Lambda 的错误响应:已处理”
Webpack 和 AWS Lambda 问题 - 模块上缺少处理程序