Amazon web services AWS Lambda在回调后继续执行
我使用API网关+AWS Lambda来处理松弛的API请求。Slack要求Lambda函数在3秒内响应2XX,因此我需要快速响应,然后触发一些长时间运行的db操作。问题在于AWS Lambda要么(1)等待直到事件循环为空,然后再将响应返回到API网关,要么(2)在调用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来执行长时间运行的操作。这似乎很好,但我很
回调
函数时立即返回响应,但随后会立即冻结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更容易,一个使用事件调用类型调用另一个。