API网关和Lambda之间的限流问题

5
据我的理解,API Gateway默认有1000 RPS(每秒请求数)的限制。当超过此限制时,它将开始限制调用并返回429错误代码。经过网关后,Lambda有100个并发调用限制。当超过此限制时,它将开始限制调用并返回500(或502)错误代码。
鉴于此,在Cloudwatch上查看我的图表时,我期望我的被限制调用的数量应该更接近4XX错误的数量,或者至少高于5XX错误的数量,因为这些调用必须首先通过API Gateway才能到达Lambda。然而,看起来被限制的调用数量更接近于5XX错误的数量。
我是否可能在阅读图表时遗漏了什么?

1
我希望我的被限制调用数量更接近于4XX错误的数量。为什么?这两件事情不是无关的吗?您自己说过,Lambda限流会生成5XX错误,而API Gateway速率限制事件会生成4XX错误,这在定义上不会作为Lambda限流计入,因为Lambda从未看到该请求,因为API Gateway已经将其拒绝了。 - Michael - sqlbot
3
确认一下,您在Cloudwatch中的“被限制”的指标是Lambda指标,而不是API Gateway的指标,对吗? - Michael - sqlbot
有道理。如果是这样的话,有没有办法查看API网关限制的调用? - danielle
1
我不这么认为,因为它们很可能在处理路径的早期被拒绝...但这只是一种直觉上的猜测。 - Michael - sqlbot
好的,非常感谢,我会单独查看这个。最后关于这个问题的一个问题,希望这些关于API网关中的4XX代码和Lambda中的5XX代码的其他笔记是否对您来说是正确的? - danielle
1
是的,尽管API-GW每秒1000个请求和Lambda每次并发调用100个限制都是AWS支持将为您增加的软限制(如果您提出请求的话)。您不需要付费支持计划来提交此类支持请求-您只需要简要解释您的使用情况以证明增加的必要性。 - Michael - sqlbot
2个回答

2

根据Lambda函数执行的时间和请求的分散程度,您可能会在API Gateway限制之前或之后达到Lambda限制。我认为您正在比较的两个指标是彼此独立的。


0
根据 API网关请求文档

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

这意味着每100毫秒API可以处理1,000个请求。
上面的评论指出CloudWatch没有给你完整的图片。你系统的实际性能取决于lambda的运行时间和并发请求的数量。
为了更好地了解发生了什么,我建议使用以下图片中看到的Lambda负载测试器构建你自己的

测试

该lambda具有以下属性:
  1. 在调用时,它会休眠1秒钟,然后退出。
  2. 具有25个保留并发限制,这意味着lambda只执行25个并发实例。任何剩余量都将返回500错误。

请求数量:1000 并发数:25

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


命令:
bash run.sh -n 1000 -c 25

输出
Status code distribution:
  [200] 1000 responses

简要概述:
在这个案例中,请求的数量在 Lambda 和 API Gateways 的限制以下。所有执行都成功了。
请求:1000 同时:50
在第一次测试中,我们将发送 1000 个请求,分为 20 批,每批 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

Output:
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
在这个测试中,我们将发送3000个请求,分为2批,每批1500个请求。
bash run.sh -n 3000 -c 1500

Output:
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网关的限制,因此多个连接尝试被拒绝。那些通过网关的连接仍然受到我们在Lambda上设置的并发限制的限制,并返回500错误。

但是如果API网关限制为每秒10,000个请求(rps),为什么你说只有3,000个请求就超出了限制? - Daniel Barral
在这个例子中,我们使用了“保留并发”字段来减少此 Lambda 的限制,并产生上面看到的结果。(请参见“测试”部分) - Kerri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接