amazon-web-services - 在 Lambda 函数中关闭 DAX 客户端

标签 amazon-web-services amazon-dynamodb aws-lambda amazon-elasticache amazon-dynamodb-dax

我有一个 node.js 函数,我想将其部署为 AWS Lambda 函数。我注意到,当我使用 redis Elasticache 时,我必须关闭使用 redis.createClient 打开的连接,否则 Lambda 函数会超时。我通过简单地调用客户端的 quit() 方法来完成此操作。如果我在发出 Lambda 回调之前执行此操作,Lambda 函数将按预期结束。如果我不这样做,Lambda 函数将按照我设置的任何超时间隔超时。在测试设置中,我有一个在缓存上运行并在 30 毫秒内终止的 Lambda 函数。如果不调用 redis 客户端 quit() 方法,同一 Lambda 函数将不会在 1 分钟超时之前终止。我不确定,但我假设 Lambda 函数会以这种方式运行,因为它不知道该函数是否已完成执行(即使在回调之后),因为 redis 连接仍然处于事件状态。

我不太关心这个,因为调用 quit() 方法很容易。我遇到的问题是当我尝试使用 DynamoDB DAX 客户端执行类似操作时。我可以让 Lambda 函数直接通过我的 VPC 终端节点访问 DynamoDB,一切正常。如果我使用 DAX 客户端,对表的修改实际上会发生(我插入了一个项目,可以看到它在那里),但 Lambda 函数总是超时。

这里是一些示例代码:

const AmazonDaxClient = require('amazon-dax-client');
const AWS             = require('aws-sdk');
const config          = require('./config');

AWS.config.update(config.aws);
var ddbClient = new AWS.DynamoDB.DocumentClient(config.dynamodb);
var dax = new AmazonDaxClient(config.dax);
var daxClient = new AWS.DynamoDB.DocumentClient({service: dax });

如果我只使用 ddbClient,一切正常。如果我使用 daxClient,一切都会正常(插入、删除、更新等),但 Lambda 函数会超时。 daxClient 是否有类似的 quit() 方法来告诉 DAX 集群我已经完成并且可以干净地关闭所有连接?我怀疑这个问题是他们希望 daxClient 的行为与普通 ddbClient 完全相同,并且 ddbClient 没有 quit() 方法。

最佳答案

它看起来像 Lambda context 属性 callbackWaitsForEmptyEventLoop,如文档 here 所示。 ,可能与您的案例相关。默认情况下,它设置为 true,这意味着即使您的处理程序通过回调返回一个值,只要 Node 事件循环中仍有任何内容,Lambda 就不会完成其执行。

将其设置为 false 将允许您的 Lambda 处理程序即使在事件循环中也能完成,但请注意,当 Lambda 未运行时,这些逻辑线程将卡住执行。此行为可能并不适合所有库,具体取决于它们的健壮程度。

有趣的是,调用 context.succeed(而不是 callback)的旧 Lambda 返回样式将不会等待空事件循环,无论属性的设置。 (This gist 进入一些额外的细节。)

关于amazon-web-services - 在 Lambda 函数中关闭 DAX 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47401616/

相关文章:

python - 新文件的 S3 铲斗传感器

amazon-web-services - 在本地Serverless离线环境下通过SNS消息调用Lambda函数

aws-lambda - 使用 aws sam local 访问写入/tmp 的文件

amazon-web-services - AWS System Manager Parameter Store vs Secrets Manager vs Lambda 中的环境变化,何时使用哪个

ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions

amazon-web-services - 将AWS Lambda函数代码直接存储在S3存储桶中

go - 具有许多属性的 UpdateItem

amazon-web-services - 如何设置 AWS Mobile Hub DynamoDB 以进行匿名数据收集

java - DynamoDBMapper scanPage 没有返回结果

node.js - 为什么简单的 SQL 查询会导致我的 Lambda 函数显着变慢?