当前位置: 首页 > 知识库问答 >
问题:

AWS lambda功能在超时错误后停止工作

尉迟越
2023-03-14

我有一个简单的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函数的任何后续调用都应该有效。我知道我总是可以增加配置超时,但宁愿不要。

共有3个答案

西门经国
2023-03-14

我也遇到过同样的问题,事实上,在很多情况下,Lambda变得没有反应,例如:

>

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

不幸的是,它仍然没有被修复,在一些测试之后,它发现事实上Lambda试图重新启动(重新加载容器?),只是时间不够。如果您将超时设置为10秒,在执行时间~4秒后,Lambda开始工作,然后在下一次运行中开始正常运行。我也尝试过设置:

context.callbackWaitsForEmptyEventLoop = false;

把所有的“require”块放在处理程序中,什么都不起作用。防止Lambda死机的唯一方法是设置更大的超时,10秒应该足以作为防止此错误的变通保护。

楚嘉胜
2023-03-14

如果在函数配置中定义了3秒,那么这个超时将覆盖代码中的时间,因此请确保从lambda函数配置中增加超时,然后重试wait(),它应该会工作!

裴畅
2023-03-14

您应该了解函数句柄如何与特定的上下文一起工作。callbackhaitsforemptyeventloop

如果该布尔类型为false,则永远不会触发setTimeout,因为您可能已经回答/处理了lambda调用。但是,如果callbackhaitsforemptyeventloop的值为true,那么你的代码将完成你想要的功能。

此外,通过回调直接处理所有事情可能更容易,无需“手写”超时、更改配置超时等等。。。

例如。

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));
};
 类似资料:
  • 问题内容: 我有一个小的jquery片段,该页面在屏幕顶部显示通知消息,以响应页面上的用户操作。该通知通常在Ajax操作之后显示,其中包含动态内容。 例如: 该通知运行良好,除非用户连续快速执行两个或多个操作,否则超时功能将使自己感到困惑,并且第二条消息似乎在之前的3000毫秒之内。 如果执行新操作,是否有办法“杀死”先前的通知。我对动作/选择器没有问题,只是TimeOut函数....要么停止它,

  • 我正在编写使用Spring Boot的小型web应用程序。一切都运行得很好,然后我添加了一些hibernate和Spring Security特性,现在我的不能工作了。现在我只得到一些关于像这样映射的日志: O.s.w.s.handler.SimpleURLHandlerMapping:将URL路径[/**/Favicon.ico]映射到类型为[class org.SpringFramework.

  • 我刚刚在MySQL Workbench6.3社区中运行了一个脚本。我已将其设置为“在错误时停止脚本执行”。 有两个查询给出错误。错误上写着“错误代码:1175”。您正在使用安全更新模式,并且试图更新一个没有使用键列禁用安全模式的WHERE的表,请在Preferences->SQL Editor中切换该选项,然后重新连接。好吧,我错过了。没什么大不了的. 但在那之后,脚本就像根本没有错误一样简单地继

  • 最近我的Firebase云函数经常出错。特别是当用户发布帖子并将帖子复制到用户所有追随者的提要集合时触发的功能。 我的代码是这样的: 直到最近,函数一直运行良好,但现在有些人有100个追随者,函数经常失败,有2个错误: 错误:进程已退出,代码为16 错误:超过4个截止日期:超过截止日期 我知道第一个错误意味着已经发送了一些类似头的信息,但我不知道我的函数有什么问题。我也知道firebase有一些写

  • 我的java代码中有一个异步链,我想在某个超时后停止它,所以我创建了一个包含一些线程的线程池,并像这样调用CompletableFuture 然后我有一个循环方法,从数据库加载数据并对其执行一些任务,一旦所有CompletableFutures都完成了,它就会再次执行 我的问题是task6,它有一个非常密集的任务(它是一个网络连接任务,有时会永远挂起)。我注意到我的orTimeout在30秒后被正

  • 问题内容: 单击导航中的每个链接,我正在播放一个小型音频剪辑 HTML代码: JS代码: 到目前为止,一切正常。 问题是,当声音剪辑已经在运行时,我单击任何链接都不会发生任何事情。 我尝试停止单击链接时已经播放的声音,但是HTML5的音频API中没有直接的事件 我尝试了以下代码,但无法正常工作 有什么建议吗? 问题答案: 相反,您可以尝试: 这应该具有预期的效果。