Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS Lambda在回调后继续执行_Amazon Web Services_Aws Lambda_Slack Api - Fatal编程技术网

Amazon web services AWS Lambda在回调后继续执行

Amazon web services AWS Lambda在回调后继续执行,amazon-web-services,aws-lambda,slack-api,Amazon Web Services,Aws Lambda,Slack Api,我使用API网关+AWS Lambda来处理松弛的API请求。Slack要求Lambda函数在3秒内响应2XX,因此我需要快速响应,然后触发一些长时间运行的db操作。问题在于AWS Lambda要么(1)等待直到事件循环为空,然后再将响应返回到API网关,要么(2)在调用回调函数时立即返回响应,但随后会立即冻结Lambda执行及其长时间运行的操作 在阅读和其他帖子时,通常的做法似乎是使用两个lambda:一个立即发送2XX响应,然后触发另一个lambda来执行长时间运行的操作。这似乎很好,但我很

我使用API网关+AWS Lambda来处理松弛的API请求。Slack要求Lambda函数在3秒内响应2XX,因此我需要快速响应,然后触发一些长时间运行的db操作。问题在于AWS Lambda要么(1)等待直到事件循环为空,然后再将响应返回到API网关,要么(2)在调用
回调
函数时立即返回响应,但随后会立即冻结Lambda执行及其长时间运行的操作

在阅读和其他帖子时,通常的做法似乎是使用两个lambda:一个立即发送2XX响应,然后触发另一个lambda来执行长时间运行的操作。这似乎很好,但我很好奇,是否只需一次lambda调用就可以做到这一点

Mark B提供的选项#1似乎表明AWS服务集成类型是可能的。但是在设置AWS服务集成并将调用类型头设置为“Event”之后,我仍然看到在运行
回调后Lambda执行立即被冻结

我的小测试处理器看起来像这样。我怀疑Cloudwatch在运行
回调后不会登录,因此我让处理程序在5秒超时后向ngrok发出请求。我希望立即收到回调响应,5秒钟后,我通过ngrok收到GET请求

const https = require('https');

exports.handler = function(event, context, callback) {
    context.callbackWaitsForEmptyEventLoop = false;

    const options = {
      hostname: 'f3e7f2cc.ngrok.io',
      port: 443,
      path: '/',
      method: 'GET'
    };

    setTimeout(function() {
        console.log(options);
        const req = https.request(options, (res) => {
            console.log('statusCode:', res.statusCode);
            console.log('headers:', res.headers);
        });

        req.end();
    }, 5000);

    const end = new Date().toUTCString();
    callback(null, {body: "OK", timeEnd: end});
};

然而,我可以看到,这并不像预期的那样有效。我立即得到
回调
响应,但5秒后没有收到get请求。是否有其他配置需要调整以使其运行?或者我应该使用2 lambda方法吗?

据我所知,您的问题是lambda是以同步方式执行的,执行时间太长。

解决方案是以异步方式调用Lambda。在这种情况下,您将从网关获得即时响应,并将使用内部Lambda队列计划Lambda的执行。


描述了如何做到这一点。它适合我。

为什么不使用两个lambda呢?正如您所提到的,使用两个lambda更容易,一个使用
事件调用类型调用另一个。