【问题标题】:aws lambda execution after callback guaranteed?保证回调后执行aws lambda?
【发布时间】:2017-08-16 10:02:03
【问题描述】:

通过 API GW 调用的我的 node4 lambda 函数进行了一系列缓慢的 API 调用。 为了不让用户等到一切都完成,我打算让我的代码看起来像这样:

function(event, context, callback) {
  ...
  // Return users API GW call now
  callback(null, data);
  // Do the heavy lifting afterwards.
  longApiCall().then(otherLongApiCalls)
}

但现在我在AWS docs 中读到: "回调将等待 Node.js 运行时事件循环为空,然后冻结进程并将结果返回给调用者"

这是否意味着 API GW 在 longApiCalls 完成之前或之后返回响应数据?

如果之后,有没有建议的方法来在一切完成之前“提前返回”?

【问题讨论】:

    标签: node.js amazon-web-services callback aws-lambda aws-api-gateway


    【解决方案1】:

    在您当前的配置中,API Gateway 将等到 Lambda 函数完成执行后再发送响应。您的选择是:

    1. 将 API Gateway 终端节点的集成类型更改为 AWS 服务,并让 API Gateway 异步调用 Lambda 函数。这已记录在 here
    2. 让 API Gateway 调用的 Lambda 函数只执行异步调用另一个 Lambda 函数然后返回。
    3. 让 API Gateway 或 API Gateway 调用的 Lambda 函数向 SNS 主题发送消息。然后让 SNS 主题触发处理长 API 调用的 Lambda 函数。这会稍微解耦您的微服务。
    4. 让 API Gateway 或 API Gateway 调用的 Lambda 函数触发 AWS Step Function,该 AWS Step Function 被配置为通过一个或多个 Lambda 函数处理长 API 调用。如果长 API 调用存在运行超过单个 Lambda 函数 5 分钟执行时间限制的风险,我建议使用这种方法。

    【讨论】:

    • FWIW,我沿着 #2 前进并被限制的差异所困扰:虽然同步 lambda 调用处理 6MB 的主体,但 lambda 在 >128K 的主体上作为事件错误运行!我认为大多数或所有解决方案都会遇到这个问题。 docs.aws.amazon.com/lambda/latest/dg/limits.html
    • 注意 #1 您不能根据链接文档从 lambda 返回数据。
    【解决方案2】:

    选项 5。让您的 lambda 函数将消息排队到 SQS,并从另一个 lambda 或 ec2 或您想要完成繁重工作的地方轮询队列。

    【讨论】:

    • 您不能从另一个 lambda 轮询 SQS。为此,您需要通过 cron 触发 lambda,然后需要检查 SQS 是否有消息。如果在那次运行中您没有收到消息,则需要等到 cron 再次触发 lambda。在这种情况下,您最好使用 EC2。
    • 您可以轻松设置每分钟触发 lambda 的 Cloudwatch 事件。或者从去年开始,您可以让 SQS 调用 Lambda:aws.amazon.com/de/blogs/aws/…
    猜你喜欢
    • 2020-04-14
    • 2016-05-01
    • 2017-07-01
    • 1970-01-01
    • 2017-10-05
    • 2020-10-17
    • 1970-01-01
    • 2022-11-28
    • 2020-08-07
    相关资源
    最近更新 更多