Можем ли мы использовать рекурсию с AWS лямбда-функцией, которая останавливает выполнение в течение 15 минут и сохраняет точку, в которой она остановилась? - PullRequest
0 голосов
/ 02 апреля 2020
  1. отслеживать время, прошедшее в лямбда-функции, остановить его на 9-10 мин.
  2. сохранить точку, в которой оно остановилось, и продолжить до тех пор, пока задача не будет завершена
  3. принудительное использование лямбда-функции

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Я поддерживаю ответ Джона Ротенштейна о том, что если вы используете лямбду таким образом, вам, вероятно, не следует использовать лямбду. Хотя из моего собственного любопытства я думаю, что код, который вы будете искать, выглядит следующим образом (написано Node.JS)

let AWS = require('aws-sdk');
let functionName = 'YOUR_LAMBDA_FUNCTION_NAME'
let timeThreshholdInMillis = 5000 // 5 seconds

exports.handler = (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);
}

Редактировать: пример

Это должно прояснить, как «проходящий прогресс» будет работать в рекурсивных лямбдах.

Допустим, вы хотите увеличивать переменную (+1) каждую секунду, и вы хотите сделать это в лямбде.

Givens Мы будем увеличивать переменную на 1 один раз каждые 1000 мс. Лямбда будет работать, пока оставшееся время не станет <5000 мс. Тайм-аут выполнения лямбды составляет 60000 мс (1 минута). </p>

Псевдокод лямбда-функции:

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)

}
0 голосов
/ 02 апреля 2020

Не уверен, что вы пробуете, но взгляните на 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...