61

我对 API 网关有一些问题。我做了一些 API 方法,有时它们的工作时间超过 10 秒,亚马逊返回 504 错误。下面是截图:

在此处输入图像描述

请帮忙!如何增加超时?

谢谢!

4

10 回答 10

34

根据http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html ,目前 Lambda 调用或 HTTP 集成的默认限制是30 秒,并且此限制不可配置。

于 2016-11-13T12:11:37.380 回答
23

截至 2017 年 12 月,最大值仍然是 29 秒,但应该可以自定义超时值。

https://aws.amazon.com/about-aws/whats-new/2017/11/customize-integration-timeouts-in-amazon-api-gateway/

这可以在 APIGateway 中每个方法的“集成请求”中设置。

于 2017-12-31T08:12:30.197 回答
13

你不能增加超时,至少现在不能。您的端点必须在 10 秒或更短时间内完成。您需要努力提高端点的速度。

http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html

于 2015-08-20T21:30:55.427 回答
10

Lambda 函数将在达到最大值后超时。5分钟;API 网关请求将在 29 秒后超时。你不能改变它,但你可以用异步执行模式来解决它,我写了我的博客文章:

https://joarleymoraes.com/serverless-long-running-http-requests/

于 2017-11-27T16:03:00.540 回答
5

我想对“joarleymoraes”帖子发表评论,但没有足够的声誉。唯一要补充的是,您不必重构以使用异步,这仅取决于您的后端以及如何拆分它+您的客户端重试。

如果您没有看到高百分比的 504 并且您还没有准备好进行异步处理,您可以在客户端重试上使用指数退避来实现它们,这样它们就不会出现永久性故障。

AWS 开发工具包自动实施带回退的重试,因此它可以帮助简化,特别是因为Lambda 层将允许您为您的函数维护开发工具包,而无需不断更新您的部署包。

一旦你这样做,就会导致对这些超时的可见性降低,因为它们不再是永久性故障。这可以为您争取一些时间来处理核心问题,即您首先看到的是 504。这当然可能意味着重构您的代码以获得更多响应,将大型功能拆分为更多“微服务”类型的概念并减少外部网络调用。

重试的另一个好处是,如果您重试应用程序的所有 5xx 响应,它可以涵盖您在正常执行期间可能会看到的许多不同问题。在所有应用程序中通常认为这些问题永远不会 100% 避免,因此最好的做法是继续做最坏的打算!

话虽如此,您仍然应该致力于减少 lambda 执行时间或实现异步。这将允许您将超时值设置为更小的数字,从而使您更快地失败。这有助于减少对前端的影响,因为它不必等待 29 秒来重试失败的请求。

于 2019-09-25T01:28:21.380 回答
3

超时可以减少,但不能增加超过 29 秒。您方法的后端应在 29 秒之前返回响应,否则 API 网关将抛出 504 超时错误。

或者,如上面一些答案中所建议的,您可以将后端更改为发送状态代码 202(已接受),这意味着请求已成功接收,然后后端继续进一步处理。当然,在实施变通方法之前,我们需要考虑用例及其要求

于 2019-05-25T22:05:07.867 回答
2

虽然您不能增加超时,但如果工作是可以拆分的,您可以将 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

于 2016-09-01T23:33:06.723 回答
1

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-11-08T11:19:32.767 回答
1

截至 2021 年 5 月 21 日,这仍然是一样的。最大时间的硬限制是 30 秒。以下是API网关配额的官方文档。 https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#http-api-quotas

于 2021-05-21T11:34:14.990 回答
1

超时限制不能增加,因此应在 30 秒内返回响应。我通常做的解决方法:

  • 以异步方式发送结果。lambda 函数应该触发另一个进程并向客户端发送响应,说成功启动了进程 X,并且另一个进程应该在完成后以异步方式通知客户端(点击端点,发送松弛通知或电子邮件..)。你可以找到很多关于这个主题的有趣资源
  • 在 lambda 函数中充分利用多处理的潜力并增加内存以加快计算时间
  • 最终,如果您需要以同步方式返回结果并且一个 lambda 函数无法完成这项工作,您可以直接将 API 网关与 step 函数集成,这样您就可以让多个 lambda 函数并行工作。看似复杂,其实很简单
于 2021-10-01T11:33:18.043 回答