【问题标题】:Quickly return a response from AWS Lambda从 AWS Lambda 快速返回响应
【发布时间】:2018-10-22 06:56:44
【问题描述】:

我有一个 Node.js 8.10 Lambda。它响应对我的 API 网关的 POST 请求。

我想:

  1. 响应用户。
  2. 等待 3.5 分钟。
  3. 做些有用的事。

我的代码是这样的:

function handler(event, context, lambdaCallback) {
  //210000 milliseconds is 3.5 minutes
  let timeToWait = 210000;

  //respond to the caller and continue to process the request
  lambdaCallback(null, {"message": "process started"});

  setTimeout(() => {
    doSomethingUseful();
  }, timeToWait);

}

doSomethingUseful() 在所有情况下都会在指定的超时后运行。

问题是我没有得到回应。我认为 API 网关响应超时会终止响应 - 通常我会得到:{ "message": "Endpoint request timed out" }

我认为 API 网关响应超时会终止响应,因为如果我将 timeToWait 减少到一个微不足道的值,我会得到预期的响应 ({"message": "process started"})。

关于如何在 setTimeout 结束之前发送快速响应的任何想法?

【问题讨论】:

  • 你应该重新设计这个。也许您的 Lambda 可以将消息排入队列并立即响应用户。异步地,另一个进程将处理与排队消息相关的工作。这可能是计划的 Lambda(例如,每 5 分钟醒来一次并寻找工作)和 SQS 或其他东西的组合。
  • 在 Lambda 函数完成之前,您无法返回响应。提前调用回调不会改变这一点。
  • @sqlbot 感谢您的回复。我对 AWS 文档的声明感到困惑,即“当回调被调用(显式或隐式)时,AWS Lambda 会继续调用 Lambda 函数,直到事件循环为空。” link。我以为它会在调用时调用callback。显然这是错误的。我现在把它读作“你可以随时调用callback,但在函数完成之前它不会触发。”再次感谢您花时间提供帮助。一个下来,一百万去。 . . :)

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


【解决方案1】:

使用AWS Step Functionswait state

  1. 从 lambda 1 开始并将响应发送回用户
  2. 使用3.5分钟的等待状态
  3. 调用第二个 lambda 来做其他有用的事情

【讨论】:

    【解决方案2】:

    AWS Step Functions 作为公认的答案是一个很好的选择(并且可能是满足特定要求的最佳选择)。但是,我还想指出,您可以使用 SQS and delayed events which trigger a lambda function.

    来做到这一点

    注意:对于那些想要超过 OP 所要求的 3.5 分钟的人来说,最长时间是 15 分钟。


    您也可以使用EventInvocationType 执行an Invoke of another lambda function(异步调用)。这允许在用户向他们发送响应后运行,但显然辅助 lambda 的操作必须完全隔离,因为我们无法从它向用户返回响应。这绝对不是 OP 的正确解决方案,因为没有理由支付 3.5 分钟的 lambda 运行时间来让它什么都不做,但这种模式可能非常有用。

    我使用asyncInvoke 模式,当我有需要完成的in-vpc 处理时,我不希望用户在不必要时处理可怕的 lambda 10 秒 VPC 冷启动 /请求的连接部分。


    注意:如果您使用上述任一方法,强烈建议您为 lambda 函数设置 Dead Letter Queue,因为异步调用会在失败时重试执行多次.


    无论如何,不​​要减损基于 OP 需求的最佳答案,但认为看看帖子上发生的其他人可能会有什么其他可能性会很有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-28
      • 2016-08-15
      • 1970-01-01
      • 2020-04-24
      • 2017-10-04
      • 1970-01-01
      • 2016-02-25
      • 2020-05-17
      相关资源
      最近更新 更多