it-roy-ru.com

Контекст против обратного вызова в AWS Lambda

Я люблю использовать лямбда-функции в AWS. В идеале это сократило мое время на обслуживание серверов. Мой вопрос заключается в том, что при использовании лямбды есть объект контекста и функция обратного вызова для завершения функции. Есть ли какой-либо вариант использования обратного вызова через контекст.

Может ли кто-нибудь сказать мне поведение context.succeed () для обратного вызова (ошибка, сообщение)

var startedAt = new Date();

var interval = setInterval(function () {
    console.log(startedAt, new Date());
}, 1000);

exports.handler = function (event, context, callback) {
    setTimeout(function () {
        console.log('returning');
        // v1:
        return callback(null);
        // v2:
        // return context.succeed();
    }, 5000);
};
8
Naveen Kerati

context.succeed - это более старый способ работы и поддерживается в среде выполнения 0.10.42 (где параметр callback специально не используется). Если вы работаете в более новых средах выполнения (4.3 и 6.10), он включен для обратной совместимости, но теперь «правильным» способом является использование функциональности callback.

9
James Thorpe

Здесьcallback представлен как улучшение для context.succeed.

Кроме того, цикл обработки событий позволяет Node.js выполнять неблокирующие операции ввода-вывода. если callback ожидает дольше, чем вы ожидаете, это означает, что в цикле событий есть другие незавершенные задачи, о которых вы не знаете, и это проблема - вы должны знать, какие задачи ожидают в очереди. Вы можете использовать следующие функции , чтобы понять, почему callback ждет: 

process._getActiveHandles() //gets you handles that are still alive
process._getActiveRequests() //gets you info about active libuv requests.

Замораживание лямбды перед выполнением этих задач может привести к неожиданному поведению. Следующее лямбда-выполнение может быть выполнено в том же контейнере. Это означает, что задачи цикла событий предыдущего лямбда-выполнения завершаются в текущем лямбда-выполнении. 

Кроме того, при условии, что у вас есть более одного теста для exports.handler, с callback каждый тест независим. С context.succeed ваш второй тест может пройти (а не провалиться) из-за первого теста, оставив задачи в цикле событий. 

3
KernelMode