There are many existing algorithms for throttling, you need to choose the one that fits the best your needs. At the moment, only the following algorithm can be found in Tolerance:
- Leaky bucket, a rolling time frame rate limit
Each implementation implements the
RateLimit interface that contains the following methods:
boolReturns true if the given identifier reached the limit
floatReturns the number of ticks that represents the moment when the rate will be under the limit.
tick(string $identifier)Register a tick on the bucket, meaning that an operation was executed
The leaky bucket algorithm ensure that the number of operations won’t exceed a rate on a given rolling time frame.
1 2 3 4 5 6 7 8
use Tolerance\Throttling\Rate\TimeRate; use Tolerance\Throttling\RateLimit\LeakyBucket; use Tolerance\Throttling\RateMeasureStorage\InMemoryStorage; $rateLimit = new LeakyBucket( new InMemoryStorage(), new TimeRate(10, TimeRate::PER_SECOND) );
You can have a look to the LeakyBucket unit tests to have a better idea of how you can use it directly.