I'm attempting to implement Laravel 5.7's queue job rate limiting which for use when queue jobs hit an external API that's rate limited.
Here's my job:
public function handle() {
echo 'about to check throttling'.PHP_EOL;
Redis::throttle('throttle-test')->allow(10)->every(5)->then(function () {
// this is never executed
echo 'doing work'.PHP_EOL;
}, function () {
// also never executed
echo 'released back onto queue'.PHP_EOL;
return $this->release(10);
});
}
There's no mention of needing to use Redis for queues, cache or anything of that nature in the docs, aside from "...application can interact with a Redis server." Either way, here's my env vars:
DB_CONNECTION=mysql
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=redis
I've confirmed the RedisServiceProvider
is receiving the correct configuration it expects:
array:3 [
"client" => "predis"
"default" => array:4 [
"host" => "redis"
"password" => null
"port" => "6379"
"database" => 0
]
"horizon" => array:5 [
"host" => "redis"
"password" => null
"port" => "6379"
"database" => 0
"options" => array:1 [
"prefix" => "horizon:"
]
]
]
I'm struggling to understand why there's no runtime errors, it's just that nothings get executed. If I comment out the throttle stuff the job runs fine and does what it's supposed to do. What am I missing about the requirements to use this throttling?
The documentation for Laravel in this case is very misleading. While it implies you only need a connection to Redis
you actually have to be using Redis
for your queues.