我对 API 网关有一些问题。我做了一些 API 方法,有时它们的工作时间超过 10 秒,亚马逊返回 504 错误。下面是截图:
请帮忙!如何增加超时?
谢谢!
根据http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html ,目前 Lambda 调用或 HTTP 集成的默认限制是30 秒,并且此限制不可配置。
截至 2017 年 12 月,最大值仍然是 29 秒,但应该可以自定义超时值。
这可以在 APIGateway 中每个方法的“集成请求”中设置。
你不能增加超时,至少现在不能。您的端点必须在 10 秒或更短时间内完成。您需要努力提高端点的速度。
http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
Lambda 函数将在达到最大值后超时。5分钟;API 网关请求将在 29 秒后超时。你不能改变它,但你可以用异步执行模式来解决它,我写了我的博客文章:
https://joarleymoraes.com/serverless-long-running-http-requests/
我想对“joarleymoraes”帖子发表评论,但没有足够的声誉。唯一要补充的是,您不必重构以使用异步,这仅取决于您的后端以及如何拆分它+您的客户端重试。
如果您没有看到高百分比的 504 并且您还没有准备好进行异步处理,您可以在客户端重试上使用指数退避来实现它们,这样它们就不会出现永久性故障。
AWS 开发工具包自动实施带回退的重试,因此它可以帮助简化,特别是因为Lambda 层将允许您为您的函数维护开发工具包,而无需不断更新您的部署包。
一旦你这样做,就会导致对这些超时的可见性降低,因为它们不再是永久性故障。这可以为您争取一些时间来处理核心问题,即您首先看到的是 504。这当然可能意味着重构您的代码以获得更多响应,将大型功能拆分为更多“微服务”类型的概念并减少外部网络调用。
重试的另一个好处是,如果您重试应用程序的所有 5xx 响应,它可以涵盖您在正常执行期间可能会看到的许多不同问题。在所有应用程序中通常认为这些问题永远不会 100% 避免,因此最好的做法是继续做最坏的打算!
话虽如此,您仍然应该致力于减少 lambda 执行时间或实现异步。这将允许您将超时值设置为更小的数字,从而使您更快地失败。这有助于减少对前端的影响,因为它不必等待 29 秒来重试失败的请求。
超时可以减少,但不能增加超过 29 秒。您方法的后端应在 29 秒之前返回响应,否则 API 网关将抛出 504 超时错误。
或者,如上面一些答案中所建议的,您可以将后端更改为发送状态代码 202(已接受),这意味着请求已成功接收,然后后端继续进一步处理。当然,在实施变通方法之前,我们需要考虑用例及其要求
虽然您不能增加超时,但如果工作是可以拆分的,您可以将 lambda 链接在一起。
使用 aws SDK:
var aws = require('aws-sdk');
var lambda = new aws.Lambda({
region: 'us-west-2' //change to your region
});
lambda.invoke({
FunctionName: 'name_of_your_lambda_function',
Payload: JSON.stringify(event, null, 2) // pass params
}, function(error, data) {
if (error) {
context.done('error', error);
}
if(data.Payload){
context.succeed(data.Payload)
}
});
来源:AWS Lambda 函数能否调用另一个 AWS 文档:http ://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
Lambda 函数有 15 分钟的最大执行时间,但由于 APIGateway 有严格的 29 秒超时策略,您可以执行以下操作来克服这一点。
要立即修复,请尝试增加您的 lambda 函数大小。例如:如果您的 lambda 函数有 128 MB 内存,您可以将其增加到 256 MB。更多内存有助于函数更快地执行。
或者
您可以使用 lambdaInvoke() 函数,它是“aws-sdk”的一部分。使用 lambdaInvoke() 而不是通过 APIGateway,您可以直接调用该函数。但这仅在服务器端有用。
或者
解决这个问题的最佳方法是 -> 向 APIGateway 发出请求 -> 在函数内部将接收到的数据推送到SQS队列中 -> 立即返回响应 -> 准备好一个 lambda 函数,该函数在此 SQS 队列中可用时触发 ->在这个触发的函数中执行您实际时间复杂的执行 -> 将数据保存到数据存储 -> 如果调用来自客户端(浏览器/移动应用程序),则实施长轮询以从同一数据存储中获取最终处理结果.
现在由于 api 在将数据推送到SQS后立即返回响应,因此您的 main 函数执行时间现在将大大减少,并将解决 APIGateway 超时问题。
还有其他方法,例如使用 WebSockets、编写事件驱动代码等。但上述方法的实现和管理要简单得多。
截至 2021 年 5 月 21 日,这仍然是一样的。最大时间的硬限制是 30 秒。以下是API网关配额的官方文档。 https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#http-api-quotas
超时限制不能增加,因此应在 30 秒内返回响应。我通常做的解决方法: