有什么方法可以在代码级别捕获AWS lambda超时错误?

时间:2018-11-26 09:35:08

标签: amazon-web-services aws-lambda

有什么方法可以在代码级捕获AWS lambda timed out错误,以便我有机会在退出lambda函数之前处理该错误?

2 个答案:

答案 0 :(得分:4)

虽然lambda环境不会触发“定时退出”事件,但您可以自己进行一些琐碎的事情。

每种语言都有context对象公开的功能  到get the remaining time in milliseconds

您可以将其与所用任何语言的计时器功能配合使用,以确保在超时之前得到通知。

例如(节点):

function handler(event, context, callback) {
  const timer = setTimeout(() => {
    console.log("oh no i'm going to timeout in 3 seconds!");
    // &c.
  }, context.getRemainingTimeInMillis() - 3 * 1000);
  // rest of code...
  clearTimeout(timer);
  callback(null, result);
}

答案 1 :(得分:1)

我想在这里分享我的解决方案:
假设我有一个Lambda处理函数,并且我设置的超时限制为15分钟。 在此函数内部,我有一个名为work()的异步函数,可能需要15分钟以上的时间。

要捕获Lambda的超时错误,我的方法是:
我创建了一个名为timeout()的新异步函数,该函数仅在14.9分钟后返回。 我让work()timeout()函数同时启动,如果work()可以在14.9分钟内完成,那么work()返回的时间早于timeout(),否则, timeout()会更早返回。
您可以通过此图更轻松地看到它:

enter image description here

这只是race()的{​​{1}}运算符。

以下是使用rxjs实现此想法的代码:

rxjs

更新:

改为使用内置的module.exports.myFunction = async (event) => { function task() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('finished!'); }, 15 * 60 * 1000); }); } function timeout() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('timeout!'); }, 14.9 * 60 * 1000); }); } const res = await new Promise((resolve, reject) => { race(from(task()), from(timeout())) .subscribe(msg => { resolve(msg); }) }); return { res }; }; 函数:

Promise.race()
相关问题