在 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 的错误响应:已处理”

在多个 AWS Lambda 中处理相同的函数名称

Webpack 和 AWS Lambda 问题 - 模块上缺少处理程序

如何使用AWS Lambda和SNS事件触发Spring Cloud功能的重试

Amazon API Gateway 和 AWS Lambda 中的错误处理模式