我们可以对AWS lambda函数使用递归,使其在15分钟内停止执行并保存停止点吗


  1. 跟踪lambda函数中经过的时间,使其在9-10分钟时停止
  2. 保存它停止的点并继续,直到任务完成
  3. 强制使用lambda函数

我支持John Rotenstein的回应,他说如果你以这种方式使用lambda,你可能不应该使用lambda。不过,出于我自己的好奇心,我认为您要查找的代码是以下几行代码(用Node.JS编写(

let AWS = require('aws-sdk');
let functionName = 'YOUR_LAMBDA_FUNCTION_NAME'
let timeThreshholdInMillis = 5000 // 5 seconds
exports.handler = async (event, context, callback) => {
let input = JSON.parse(event['foo']); // input from previous lambda, omitted try-catch for brevity
let done // set this variable to true when your code is done
let interval = setInterval(() => {
if (done) callback(null, true)
let remainingTime = context.get_remaining_time_in_millis();
if (remainingTime < timeThreshholdInMillis) {
// Going to restart
clearInterval(interval);
// save your progress (local or remote) to `input` variable
let lambda = new AWS.Lambda();
return lambda.invoke({
FunctionName: functionName,
Payload: JSON.stringify({ 'foo': input }) // Pass your progress here
}, (err, data) => {
// kill container
if (err) callback(err)
else callback(null, data)
});
}
}, 1000);
}

编辑:示例

这是为了阐明"传递进度"在递归lambda中是如何工作的

假设你想每秒增加一个变量(+1(,并且你想在Lambda中这样做。

Givens我们将每1000ms将变量增加1。Lambda将运行直到剩余时间<5000毫秒。Lambda执行超时为60000毫秒(1分钟(。

Lambda函数伪码:

function async (event, context) {
let counter = event.counter || 0
setInterval(() => {
if (context.get_remaining_time_in_millis() < 5000) {
// start new lambda and pass `counter` variable
// so it continues counting and we don't lose progress
lambda.invoke({ payload: { counter } })
} else {
// Add 1 to the counter variable
counter++
}
}, 1000)
}

不确定您正在尝试什么,但请查看AWS步骤函数,以更好地协调无服务器递归的乐趣。还要注意成本。

入门:https://aws.amazon.com/getting-started/hands-on/create-a-serverless-workflow-step-functions-lambda/

示例:https://docs.aws.amazon.com/step-functions/latest/dg/sample-project-transfer-data-sqs.html