gpt4 book ai didi

amazon-web-services - 回调后 AWS Lambda 继续执行

转载 作者:行者123 更新时间:2023-12-03 23:49:42 25 4
gpt4 key购买 nike

我正在使用 API Gateway + AWS Lambda 来处理 Slack API 请求。 Slack 要求 Lambda 函数在 3 秒内响应 2XX,因此我需要快速响应,然后触发一些长时间运行的数据库操作。问题在于 AWS Lambda 要么 (1) 在将响应返回给 API Gateway 之前等待事件循环为空,要么 (2) 在 callback 时立即返回响应。函数被调用,但它会立即卡住 Lambda 执行和长时间运行的操作。

阅读this和其他帖子,似乎通常的方法是有 2 个 lambdas:一个立即发送 2XX 响应,然后触发另一个 lambda 来执行长时间运行的操作。这看起来不错,但我很好奇是否可以通过一次 lambda 调用来完成?

来自 this excellent answer 的选项 #1 Mark B 似乎暗示使用 AWS 服务集成类型是可能的。但关注 these instructions要设置 AWS 服务集成并将调用类型 header 设置为“事件”,我仍然看到 Lambda 执行在 callback 之后立即卡住正在运行。

我的小测试处理程序看起来像这样。我怀疑 Cloudwatch 在 callback 之后没有登录正在运行,所以我让处理程序在 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});
};

但是,我可以看到这没有按预期工作。我立即收到 callback响应,但 5 秒后未收到 GET 请求。是否需要调整其他配置才能实现这一目标?还是我应该使用 2 lambda 方法?

最佳答案

据我了解,您的问题是 Lambda 以同步方式执行,并且执行时间过长。

解决方案是在 中调用 Lambda异步 道路。在这种情况下,您将从 Gateway 获得立即响应,并且您的 Lambda 的执行将使用内部 Lambda 队列进行安排。

描述了如何执行此操作 here .这个对我有用。

关于amazon-web-services - 回调后 AWS Lambda 继续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59450564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com