Full stack developer Timo Prüße has created a Guzzle middleware that helps you set up advanced API request throttling within your Guzzle handler stack.
Here’s the description from the GitHub repository about what guzzle-advanced-throttle
can do for external APIs that you are using that might have rate limits:
A Guzzle middleware that can throttle requests according to (multiple) defined rules. It is also possible to define a caching strategy, e.g. get the response from cache when the rate limit is exceeded or always get a cached value to spare your rate limits.
Guzzle Middlware Package
If you need to use the middleware directly outside of a Laravel project, you configure your rules as follows, which shows how flexible the middleware can be:
use hamburgscleanest\GuzzleAdvancedThrottle\RequestLimitRuleset;
$rules = new RequestLimitRuleset([
[
'host' => 'https://www.google.com',
'max_requests' => 20,
'request_interval' => 1
],
[
'host' => 'https://www.google.com',
'max_requests' => 100,
'request_interval' => 120
]
]);
And here’s how you add the middleware to your handler stack within Guzzle:
$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
$stack->push((new ThrottleMiddleware($rules))->handle());
// Pass the stack to the client
$client = new Client([
'base_uri' => 'https://www.google.com',
'handler' => $stack
]);
Laravel Package
Timo has a Laravel Wrapper package for this Guzzle middleware, which makes it easy to configure the cache and rules for use within a Laravel application.
You can use the GuzzleThrottle
facade in your Laravel projects to get a new Guzzle client instance with the Guzzle rate limit caching Handler stack:
$client = GuzzleThrottle::client([
'base_uri' => 'https://www.google.com'
]);
And here’s what the example configuration looks like from the project’s README:
return [
'cache' => [
// Name of the configured driver in the Laravel cache config file / Also needs to be set when "no-cache" is set! Because it's used for the internal timers
'driver' => 'default',
// Cache strategy: no-cache, cache, force-cache
'strategy' => 'cache',
// TTL in minutes
'ttl' => 900
],
'rules' => [
[
// host (including scheme)
'host' => 'https://www.google.com',
// maximum number of requests in the given interval
'max_requests' => 20,
// interval in seconds till the limit is reset
'request_interval' => 1
],
[
// host (including scheme)
'host' => 'https://www.google.com',
// maximum number of requests in the given interval
'max_requests' => 100,
// interval in seconds till the limit is reset
'request_interval' => 120
]
]
];
0 comments:
Post a Comment
Thanks