I'm trying to enable API Gateway throttling, but it's not working as expected.
I set Default Method Throttling Rate to 1 request per second, and Burst to 1 request.
Then I created a loop in my code to make 10 simultaneous requests to my API endpoint.
for (let i=0; i<10; i++) {
axios.get(url);
}
The expected result would be:
But the actual result was the opposite:
I repeated the process, but making 20 simultaneous request and the result was:
On CloudWatch logs for this API method, I found different Log streams, each one with only few milliseconds difference.
If I set Rate to 0 requests per second and Burst to 0 request, the throttling works and ALL requests get throttlet. But when I set Rate and Bust to 1 it does not work as expected.
Why is that happening? I need to limit my API to only 1 request per second.
There are two ways to apply limits on API calls:
When you need to apply API-level or stage-level throttling, you have to use usage plans:
A usage plan specifies who can access one or more deployed API stages and methods—and also how much and how fast they can access them
It seems AWS API Gateway throttling is not very precise for small values of rate/burst.
I imagine that there are multiple "instances" of the API Gateway running, and the values of rate and burst are "eventually consistent".
However I did not find any documentation about that.
When I made an initial request and wait 500 milliseconds before making other 99 requests, the results were "less imprecise".
Example:
axios.get(url);
setTimeout(function(){
console.log("After 500 ms");
for (let i=0; i<99; i++) {
axios.get(url);
}
}, 500);
Results:
However, it's difficult to have consistent results.