有什么方法可以在代码级捕获AWS lambda timed out
错误,以便我有机会在退出lambda
函数之前处理该错误?
答案 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()
会更早返回。
您可以通过此图更轻松地看到它:
这只是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()