【问题标题】:Throttling between API Gateway and LambdaAPI Gateway 和 Lambda 之间的限制
【发布时间】:2017-04-17 17:46:11
【问题描述】:

据我了解,API 网关默认有 1000 RPS 限制——当超过这个限制时,它将开始限制调用并返回 429 错误代码。通过网关,Lambda 有 100 个并发调用限制,当超过这个限制时,它将开始限制调用并返回 500(或 502)错误代码。

鉴于在 Cloudwatch 上查看我的图表时,我希望我的受限制调用数更接近 4XX 错误的数量,或者至少高于 5XX 错误的数量,因为调用必须首先通过 API Gateway为了到达 Lambda。但是,似乎限制调用的数量更接近 5XX 错误的数量。

我在阅读图表的方式中可能遗漏了什么?

【问题讨论】:

  • “我希望我的限制调用数更接近 4XX 错误数” 为什么?那是两件不相关的事情,不是吗?您自己说过,Lambda 油门会生成 5XX 错误,而 API Gateway 速率限制事件会生成 4XX 错误,根据定义,这不会算作 Lambda 油门,因为自从 API 网关被拒绝后,Lambda 就再也看不到请求了它失控了。
  • 确认...您在 Cloudwatch 中的“节流”指标是 Lambda 指标,而不是 API Gateway...不是吗?
  • 有道理..如果是这样的话,有什么办法可以看到 API Gateway 限制的调用?
  • 我不这么认为,因为它们可能在处理路径的早期就被拒绝了......但这只是一个直观的猜测。
  • 是的,尽管 API-GW 1000 req/s 和 Lambda 100 并发调用限制都是 AWS 支持将为您增加的软限制,if you ask。您无需付费支持计划即可提交此类支持请求 - 您只需简要说明您的用例即可证明增加的合理性。

标签: amazon-web-services lambda aws-lambda aws-api-gateway amazon-cloudwatch


【解决方案1】:

根据您的 Lambda 函数执行所需的时间以及您的请求的传播程度,您可以在 API Gateway 限制限制之前或之后达到 Lambda 限制。我想说您正在比较的两个指标是相互独立的。

【讨论】:

    【解决方案2】:

    根据 API Gateway Request documentation

    API 网关将稳态请求速率限制为每秒 10,000 个请求 (rps)

    这意味着 API 每 100 毫秒可以处理 1000 个请求。

    上面的 cmets 正确地指出 CloudWatch 没有为您提供全貌。系统的实际性能取决于 lambda 的运行时间和并发请求的数量。

    为了更好地理解发生了什么,我建议使用下图中的Lambda Load Testerbuilding your own

    测试

    使用的 lambda 具有以下属性:

    1. 在调用时,它会休眠 1 秒然后退出。
    2. 保留并发限制为 25,这意味着 lambda 将仅执行 25 个并发实例。任何盈余都将返回 500 错误。

    请求数:1000 并发数:25

    在第一个测试中,我们将分 40 批发送 1000 个请求,每批 25 个请求。

    命令:
    bash run.sh -n 1000 -c 25
    
    输出:
    Status code distribution:
      [200] 1000 responses
    
    概括:

    在这种情况下,请求数量低于 lambda 和 API 网关限制。所有的执行都成功了。

    请求数:1000 并发数:50

    在第一个测试中,我们将分 20 批发送 1000 个请求,每批 50 个请求。

    命令:
    bash run.sh -n 1000 -c 50
    
    输出:
    Status code distribution:
      [200] 252 responses
      [500] 748 responses
    
    概括:

    在这种情况下,请求的数量低于 API 网关的限制,因此每个请求都被传递给 lambda。但是,50 个并发请求超出了我们对 lambda 设置的 25 个限制,因此大约 75% 的请求返回了 500 错误。

    请求数:800 并发数:800

    在这个测试中,我们将分批发送 800 个请求,每批 800 个请求。

    命令:
    bash run.sh -n 800 -c 800
    
    输出:
    Status code distribution:
      [200] 34 responses
      [500] 765 responses
    
    Error distribution:
      [1]   Get https://XXXXXXX.execute-api.us-east-1.amazonaws.com/dev/dummy: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
    
    概括:

    在这种情况下,请求的数量开始突破 API 网关的限制,您可以看到其中一个请求超时。 800 个并发请求远远超过了我们对 lambda 设置的 25 个保留并发限制,在这种情况下,大约 95% 的请求返回 500 错误。

    请求数:3000 并发数:1500

    在此测试中,我们将分 2 批发送 3000 个请求,每批 1500 个请求。

    命令:
    bash run.sh -n 3000 -c 1500
    
    输出:
    Status code distribution:
      [200] 69 responses
      [500] 1938 responses
    
    Error distribution:
      [985] Get https://drlhus6zf3.execute-api.us-east-1.amazonaws.com/dev/dummy: dial tcp 52.84.175.209:443: connect: connection refused
      [8]   Get https://drlhus6zf3.execute-api.us-east-1.amazonaws.com/dev/dummy: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
    
    概括:

    在这种情况下,请求数量超过了 API Gateway 的限制,并且多次连接尝试被拒绝。那些确实通过网关的仍然满足我们对 lambda 设置的保留并发限制并返回 500 错误。

    【讨论】:

    • 但是如果 API 网关的限制是每秒 10,000 个请求 (rps),为什么您说它超过了只有 3,000 个请求的限制?
    • 在这个例子中,我们使用了`保留并发`字段来减少这个lamada的限制并产生上面看到的结果。 (参见“测试”部分)
    猜你喜欢
    • 2018-02-13
    • 2018-11-28
    • 2019-10-20
    • 2017-08-20
    • 2018-11-25
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多