我有一个简单的lambda函数,它异步地进行API调用然后返回数据。 99%的时间这个效果很好。当API需要更长时间然后lambda配置超时时,它会按预期给出错误。现在的问题是,当我对lambda函数进行任何后续调用时,它会永久地给出超时错误。
"errorMessage": "2016-05-14T22:52:07.247Z {session} Task timed out after 3.00 seconds"
为了测试这种情况,我将lambda超时设置为3秒,并有办法在lambda中触发这两个函数。
的Javascript
function now() {
return response.tell('success');
}
function wait() {
setTimeout(function() { return response.tell('success'); }, 4000);
}
当我调用now
函数时,没有问题。当我调用wait
函数时,我收到超时错误,然后对now
的任何后续调用都给出了同样的错误。
这是预期的行为吗?我认为对lambda函数的任何后续调用都应该有效。我知道我总是可以增加配置超时,但不愿意。
答案 0 :(得分:15)
您应该查看函数句柄如何与特定的一起使用
context.callbackWaitsForEmptyEventLoop
如果该布尔类型为false
,则不会触发setTimeout,因为您可能先前已经回答/处理了lambda调用。
但是,如果callbackWaitsForEmptyEventLoop
的值为true
- 则您的代码将执行您要查找的内容。
此外 - 通过回调直接处理所有内容可能更容易,无需“手写”超时,更改配置超时等等......
E.g。
function doneFactory(cb) { // closure factory returning a callback function which knows about res (response)
return function(err, res) {
if (err) {
return cb(JSON.stringify(err));
}
return cb(null, res);
};
}
// you're going to call this Lambda function from your code
exports.handle = function(event, context, handleCallback) {
// allows for using callbacks as finish/error-handlers
context.callbackWaitsForEmptyEventLoop = false;
doSomeAsyncWork(event, context, doneFactory(handleCallback));
};
答案 1 :(得分:8)
如果你在函数配置中定义了3秒,那么这个超时将覆盖代码中的时间,所以一定要增加lambda函数配置的超时时间并再次尝试wait(),它应该可以工作!
答案 2 :(得分:4)
我遇到了同样的问题,事实上Lambda变得没有反应的情况很多,例如:
解析无效的json:
exports.handler = function(event, context, callback)
{
var nonValidJson = "Not even Json";
var jsonParse = JSON.parse(nonValidJson);
访问未定义变量的属性:
exports.handler = function(event, context, callback)
{
var emptyObject = {};
var value = emptyObject.Item.Key;
访问RDS后未关闭mySql连接导致Lambda超时,然后它变得无响应。
当我说反应迟钝时,它甚至没有加载,即处理器内的第一次打印没有打印,而Lambda只是在超时的每次运行中退出:
exports.handler = function(event, context, callback)
{
console.log("Hello there");
这是一个由AWS团队知道近一年的错误:
https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0
不幸的是,它还没有修复,经过一些测试后,它发现事实上Lambda试图重新启动(重装容器?),没有足够的时间。如果将超时设置为10秒,则执行时间约为4秒后,Lambda开始工作,然后在下一次运行中表现正常。我也尝试过设置:
context.callbackWaitsForEmptyEventLoop = false;
并将所有'要求'处理程序内的块,没有真正有用。防止Lambda死机的唯一方法是设置更大的超时,10s应该足以防止这个bug的变通方法。
答案 3 :(得分:2)
在亚马逊控制台AWS配置中,您必须将默认超时从3秒更改为更多(最多5分钟)
答案 4 :(得分:0)
我只需要增加超时时间,错误就会消失。 我把它增加到5秒。 这对我来说没问题,因为我不会在制作中使用这个Lambda。
答案 5 :(得分:0)
我认为问题是由于IP地址,我们在AWS RDS入站/出站中提到了它。
如果您现在正在测试,并且您的node.js在本地ide上而不是在AWS上运行,那么您必须执行以下操作:
转到AWS RDS。
单击数据库实例。
全部设置。