【发布时间】:2018-05-04 05:44:09
【问题描述】:
我有一个 node.js 函数,我想将它部署为 AWS Lambda 函数。我注意到,当我使用 redis Elasticache 时,我必须关闭我用 redis.createClient 打开的连接,否则 Lambda 函数会超时。我通过简单地调用客户端的 quit() 方法来做到这一点。如果我在发出 Lambda 回调之前执行此操作,则 Lambda 函数会按预期结束。如果我不这样做,则 Lambda 函数会在我设置的任何超时间隔处超时。在测试设置中,我有一个 Lambda 函数,它在缓存上运行并在 30 毫秒内终止。如果不调用 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() 方法。
【问题讨论】:
-
您可以尝试设置
context.callbackWaitsForEmptyEventLoop = false... 这应该解决 DAX 和 redis 的超时问题,并允许您使用在处理程序外部配置的全局变量建立这些连接,并使事情变得更快一点因为您不必在每次函数调用时都初始化它们。 (我不熟悉 DAX 客户端,但如果没有此选项,Lambda 会等待是否有人打开套接字。) -
迈克尔,这在两个方面都成功了。谢谢!你想写一个答案让我接受吗?
标签: amazon-web-services amazon-dynamodb aws-lambda amazon-elasticache amazon-dynamodb-dax