【问题标题】:Context vs Callback in AWS LambdaAWS Lambda 中的上下文与回调
【发布时间】:2018-06-03 00:26:39
【问题描述】:

我喜欢在 AWS 中使用 lambda 函数。它理想地减少了我维护服务器的时间。我的问题是使用 lambda 时有上下文对象和回调函数来终止函数。有没有在上下文中使用回调的用例。

谁能告诉我 context.succeed() 到 callback(error,message) 的行为

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);
};

【问题讨论】:

    标签: javascript node.js amazon-web-services aws-lambda


    【解决方案1】:

    Here callback 表示为对context.succeed 的改进。

    此外,event loop 允许 Node.js 执行非阻塞 I/O 操作。如果callback 等待的时间比您预期的要长,这意味着您不知道事件循环中还有其他未完成的任务,这是一个问题 - 您应该知道队列中正在等待哪些任务。您可以使用following functions 来了解为什么callback 正在等待:

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

    在完成这些任务之前冻结 lambda 可能会导致意外行为。下一个 lambda 执行可以在同一个容器上完成。这意味着上一个 lambda 执行的事件循环任务在当前 lambda 执行中完成。

    另外,假设您对exports.handler 有多个测试,callback 每个测试都是独立的。使用context.succeed,由于第一个测试,您的第二个测试可以通过(而不是失败),将任务留在事件循环中。

    【讨论】:

      【解决方案2】:

      context.succeed 是较旧的处理方式,并且在 0.10.42 运行时受支持(callback 参数特别不支持)。如果您在较新的运行时(4.3 和 6.10)上运行,则包含它是为了向后兼容,但现在“正确”的方法是使用 callback 功能。

      【讨论】:

      • 是的,我同意。但是调用 callback() 确实与 context.succeed() 具有相同的行为?这里forums.aws.amazon.com/thread.jspa?messageID=755419提到如果我们使用callback()会有不可预知的结果。
      • 使用callback
      • 您能否澄清一下return 在这一切中的作用?它是像context 一样立即结束事件循环,还是以其他方式表现?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 2015-03-09
      • 2017-10-14
      • 2021-09-07
      • 2019-06-27
      相关资源
      最近更新 更多