amazon-web-services - AWS Lambda 回调后继续执行
问题描述
我正在使用 API Gateway + AWS Lambda 来处理 Slack API 请求。Slack 要求 Lambda 函数在 3 秒内以 2XX 响应,因此我需要快速响应,然后触发一些长时间运行的数据库操作。问题是 AWS Lambda 要么(1)等待事件循环为空,然后再将响应返回给 API Gateway,要么(2)在callback
调用函数时立即返回响应,但它会立即冻结 Lambda 执行和长时间运行用它进行操作。
阅读这篇文章和其他文章,似乎通常的方法是使用 2 个 lambda:一个立即发送 2XX 响应,然后触发另一个 lambda 执行长时间运行的操作。这看起来不错,但我很好奇这是否可以通过一次 lambda 调用来完成?
来自 Mark B这个出色答案的选项#1似乎表明它可以使用 AWS 服务集成类型。但是按照这些说明设置 AWS 服务集成并将调用类型标头设置为“事件”,我仍然看到 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。在这种情况下,您将立即从网关获得响应,并且您的 Lambda 的执行将使用内部 Lambda 队列进行安排。
此处描述了如何执行此操作。这个对我有用。
推荐阅读
- java - 我们可以在 java 中创建哪些不同类型的文件(文件类型)?
- c# - C# 项目未添加到列表中
- javascript - React 应用程序未在 IE 11 中显示 - 在 Chrome 中很好
- swift - UICollectionView 标题视图类似于表视图标题(不是节标题)
- asp.net - 如何使用引导程序使 ASP gridview 响应
- vb.net - 轮换名单(Of T)
- vb.net - VB.NET - 从表单类型和表单的新实例调用 .Show() 的根本区别?
- docker - 使用 Docker 时如何在本地缓存 Rust crates?
- pic - 程序 - 用于 pic18f65k40 的 UART 通信
- azure-container-service - 将 AKS 从 1 个节点扩展到 2 个节点:无法在 Node0 上创建 pod 并在 Node1 上执行(或查看日志)