Amazon web services API网关和Lambda之间的节流

Amazon web services API网关和Lambda之间的节流,amazon-web-services,lambda,aws-lambda,aws-api-gateway,amazon-cloudwatch,Amazon Web Services,Lambda,Aws Lambda,Aws Api Gateway,Amazon Cloudwatch,据我所知,API网关在默认情况下有1000 rpm的限制——当超过这个限制时,它将开始限制调用并返回429个错误代码。通过网关,Lambda有100个并发调用限制,当超过此限制时,它将开始限制调用并返回500(或502)个错误代码 有鉴于此,在Cloudwatch上查看我的图表时,我希望限制调用的数量接近4XX错误的数量,或者至少高于5XX错误的数量,因为调用必须首先通过API网关才能到达Lambda。但是,限制调用的数量似乎接近5XX错误的数量 我阅读图表的方式是否有遗漏 根据Lambda函数

据我所知,API网关在默认情况下有1000 rpm的限制——当超过这个限制时,它将开始限制调用并返回429个错误代码。通过网关,Lambda有100个并发调用限制,当超过此限制时,它将开始限制调用并返回500(或502)个错误代码

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


我阅读图表的方式是否有遗漏

根据Lambda函数执行所需的时间以及请求的分布情况,您可以在API网关节流限制之前或之后达到Lambda限制。我要说的是,您正在比较的两个指标是相互独立的

根据:

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

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

上面的评论是正确的,说明CloudWatch并没有向您提供全部信息。系统的实际性能取决于lambda的运行时和并发请求的数量

为了更好地理解正在发生的事情,我建议使用下面的图片中看到的或

测试 使用的lambda具有以下属性:

  • 调用时,它休眠1秒,然后退出
  • 具有25的保留并发限制,这意味着lambda将只执行25个并发实例。任何盈余都将返回500错误
  • 请求数:1000并发:25 在第一个测试中,我们将在40个批次中发送1000个请求,每个批次25个请求

    命令: 输出: 总结: 在本例中,请求数低于lambda和API网关限制。所有处决都成功

    请求数:1000并发:50 在第一个测试中,我们将在20个批次中发送1000个请求,每个批次50个请求

    命令: 输出: 总结: 在本例中,请求数低于API网关限制,因此每个请求都传递给lambda。但是,50个并发请求超过了我们对lambda设置的25个限制,因此大约75%的请求返回了500个错误

    请求:800并发:800 在这个测试中,我们将在一批800个请求中发送800个请求

    命令: 输出: 总结: 在本例中,请求数量开始超出API网关的限制,您可以看到其中一个请求超时。800个并发请求远远超过了我们对lambda设置的25个保留并发限制,在本例中,大约95%的请求返回了500个错误

    请求数:3000并发:1500 在本测试中,我们将分两批发送3000个请求,每个批发送1500个请求

    命令: 输出: 总结:
    在这种情况下,请求数超过了API网关的限制,并且有几次连接尝试被拒绝。那些通过网关的用户仍然符合我们对lambda设置的保留并发限制,并返回了500个错误。

    “我希望我的限制调用数接近4XX错误数”为什么?那是两件不相干的事,不是吗?您自己也说过,Lambda节流阀会生成5XX错误,而API网关速率限制事件会生成4XX错误,根据定义,这不会被视为Lambda节流阀,因为Lambda从未看到请求,因为API网关会立即拒绝它。确认。。。Cloudwatch中的“节流”指标是Lambda指标,而不是API网关。。。不是吗?这很有道理。如果是这样的话,有没有办法看到API网关阻止的调用?我不这么认为,因为它们可能在处理路径的早期就被拒绝了。。。但这只是一个直观的猜测。是的,尽管API-GW 1000 req/s和Lambda 100并发调用限制都是软限制,AWS支持将为您增加。您不需要付费支持计划来提交此类支持请求——您所需要的只是对您的用例进行简要说明,以证明增加的合理性。但是如果API网关限制为每秒10000个请求(rps)为什么说只有3000个请求就超过了限制?在本例中,我们使用“Reserved Concurrency”字段来减少此lamada的限制,并生成上面所示的结果。(见“测试”一节)
    bash run.sh -n 1000 -c 25
    
    Status code distribution:
      [200] 1000 responses
    
    bash run.sh -n 1000 -c 50
    
    Status code distribution:
      [200] 252 responses
      [500] 748 responses
    
    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)
    
    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)