Message6472
I have a POC implementation to rate limit the rest interface using the GCRA
implementation used for issue2550949. It returns the standard headers:
X-RateLimit-Remaining: 55
X-RateLimit-Reset: 3580.955768
X-RateLimit-Limit: 60
plus a non-standard header that seems to be useful:
X-RateLimit-Limit-Period: 3600
to provide the period for the X-RateLimit-Limit.
If the user has X-RateLimit-Remaining of 0 (i.e. they tripped
the rate limiter and their request was discarded with a 429)
it also returns a:
Retry-After: 60
header which is the number of seconds to wait before an api call will be
available to used. Not waiting that long will continue to result in a
429 "Too Many Requests" response.
Also in the 429 case, it returns the payload:
{
"error": {
"source": "ApiRateLimiter",
"status": 429,
"msg": "Api rate limits exceeded. Please wait: 60 seconds."
}
}
There are two new config settings:
api_calls_per_interval default 3600
api_interval_in_sec default 3600 (1 hour)
The examples above were done with api_calls_per_interval set to 60.
The code is written so that a tracker admin can replace the method
that generates the rate limiter. Rather rather than using the config
parameters, values could be stored in the user object in the database
for a modified method to use as the source of the data.
This allows a commercial user of roundup to sell different tiers of
service differing in rate limits.
The POC is not checked in. There are performance issues under high load
when storing the data needed to implement the GCRA. |
|
Date |
User |
Action |
Args |
2019-05-12 21:20:07 | rouilj | set | messageid: <1557696007.26.0.121757339918.issue2551036@roundup.psfhosted.org> |
2019-05-12 21:20:07 | rouilj | set | recipients:
+ rouilj, schlatterbeck |
2019-05-12 21:20:07 | rouilj | link | issue2551036 messages |
2019-05-12 21:20:07 | rouilj | create | |
|