Node.js 快速返回AWS Lambda的响应

Node.js 快速返回AWS Lambda的响应,node.js,amazon-web-services,aws-lambda,aws-api-gateway,Node.js,Amazon Web Services,Aws Lambda,Aws Api Gateway,我有一个Node.js 8.10 Lambda。它响应对我的API网关的POST请求 我想: 回复用户 等待3.5分钟 做一些有用的事情 我的代码是: function handler(event, context, lambdaCallback) { //210000 milliseconds is 3.5 minutes let timeToWait = 210000; //respond to the caller and continue to process the re

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

我想:

  • 回复用户
  • 等待3.5分钟
  • 做一些有用的事情
  • 我的代码是:

    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);
    
    }
    
    在所有情况下,doSomethingUser()都会在指定的超时后运行

    问题是我没有得到回应。我认为API网关响应超时会终止响应——通常我会得到:
    {“message”:“端点请求超时”}

    我认为API网关响应超时会终止响应,因为如果我将timeToWait减少到一个很小的值,就会得到预期的响应(
    {“message”:“process started”}

    关于如何在设置超时结束前发送快速响应,您有什么想法吗?

    与一起使用

  • 从lambda 1开始,将响应发送回用户
  • 使用3.5分钟的等待状态
  • 打电话给第二个lambda做其他有用的事情

  • AWS Step的功能是,公认的答案是一个很好的选择(可能是针对特定需求的最佳选择)。但是,我还想指出,您可以使用

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


    您还可以为
    调用类型
    (异步调用)使用
    事件
    。这允许在用户收到响应后运行,但显然,辅助lambda的操作必须完全隔离,因为我们无法从它向用户返回响应。这肯定不是OP的正确解决方案,因为没有理由为了让它什么都不做而支付3.5分钟的lambda运行时间,但是这种模式非常有用

    我使用
    asyncInvoke
    模式进行vpc处理,我不希望用户必须处理lambda可怕的10s vpc冷启动,因为它不是请求的必要/连接部分


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



    无论如何,不要因为OP的需要而贬低最佳答案,但我想看看其他人在帖子上可能会有什么其他的可能性是有帮助的

    你应该重新设计这个。也许您的Lambda可以将消息排队并立即响应用户。另一个进程将异步处理与排队消息相关的工作。这可能是计划的Lambda(例如,每5分钟唤醒一次并查找工作)和SQS的组合,或者其他组合。在Lambda函数完成之前,您无法从该函数返回响应。提前调用回调不会改变这一点。@sqlbot感谢您的响应。AWS文档中的语句“当调用回调(显式或隐式)时,AWS Lambda将继续Lambda函数调用,直到事件循环为空”,这让我感到困惑。我想当它被调用时,它会调用
    callback
    。显然这是错误的。我现在读到的是“你可以随时调用
    回调
    ,但它在函数完成之前不会启动。”再次感谢你花时间帮助我。一个倒下了,还有一百万……:)