Бессерверная функция перезапуска лямбды при ошибке - PullRequest
0 голосов
/ 28 декабря 2018

Моя функция lamba работает так, как она должна работать, однако иногда выдает ошибку.Но с ручным перезапуском все работает нормально.Поэтому я подумал сделать автоматическую повторную попытку при возникновении этой ошибки.

Теперь я новичок в Serverless, поэтому я хотел спросить, как мне вызвать повторные попытки при сбое / ошибке.Я пытался найти, но не смог.Я был бы счастлив, если бы кто-то мог направить меня с этим.

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Прежде чем продолжить, вам необходимо убедиться, что вы понимаете, где генерируется ошибка.

Если ваша лямбда-функция сама выполняет какое-то соединение с сокетом во время работы, а лямбда-функция получает "Сокет"«Отбой» во время выполнения, вероятно, он возвращает код состояния 5xx вашего вызывающего приложения.Вы можете сделать так, чтобы ваша лямбда-функция повторяла все, что она делала, используя любую обычную технику повторения.

Если ваше вызывающее приложение видит исключение Socket Hang Up, то проблема заключается в связи между вашим приложением и AWS.Лямбда, и добавление повторов внутри ваша лямбда-функция будет бесполезна.Вам нужно добавить повторы в ваше вызывающее приложение.

Вот пример того, как это может выглядеть:

function getUsers() {
    let retries = 0;
    let maxAttempts = 3;

    function attempt() {
        return lambda.invoke({
            ClientContext: "MyApp", 
            FunctionName: "GetUsers",
            Payload: JSON.stringify({ Active: true })
        }).promise().catch(error => {
            // We don't want to retry on EVERY error, because the error might
            // be an application error or an AWS credentials error. So here we
            // check specifically for the types of errors to retry. AWS will
            // helpfully set the "retryable" property if it's a network issue
            // that they caught.
            //
            // A socket connection might not be an AWS-generated error, so you
            // need to check it directly... this is just an example you can
            // extend:
            if (error.retryable || error.code === 'ECONNRESET') {
                retries++;
                if (retries < maxAttempts) {
                    return attempt();
                }
            }
            throw error;
        });
    }

    return attempt();
}
0 голосов
/ 28 декабря 2018

Я думаю, может быть, вам стоит посмотреть максимальное время выполнения лямбды.По умолчанию это 3 секунды, может быть, иногда ваша функция длиннее, а затем перестает работать.

Этот документ объясняет повторные попытки лямбды.

...