Laravel 队列速率限制不执行工作
Laravel queue rate limiting not executing work
我正在尝试实现 Laravel 5.7's queue job rate limiting,当队列作业遇到速率受限的外部 API 时使用。
这是我的工作:
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);
});
}
文档中没有提到需要将 Redis 用于队列、缓存或任何类似性质的内容,除了“...应用程序可以与 Redis 服务器交互”。无论哪种方式,这是我的环境变量:
DB_CONNECTION=mysql
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=redis
我已经确认 RedisServiceProvider
正在接收它期望的正确配置:
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:"
]
]
]
我很难理解为什么没有运行时错误,只是什么都没有执行。如果我注释掉油门的东西,工作就会正常运行,并且会做它应该做的事情。 关于使用此限制的要求,我缺少什么?
在这种情况下 Laravel 的文档非常具有误导性。虽然这意味着您只需要连接到 Redis
,但实际上您必须为队列使用 Redis
。
不幸的是,如果不使用 Redis
队列驱动程序,就无法 "official" 对队列进行速率限制。
我写了自定义队列工作器 mxl/laravel-queue-rate-limit that uses Illuminate\Cache\RateLimiter
to rate limit job execution (the same one that used internally by Laravel to rate limit HTTP requests).
在 GitHub page or in this SO answer 上阅读有关其用法的更多信息。
我正在尝试实现 Laravel 5.7's queue job rate limiting,当队列作业遇到速率受限的外部 API 时使用。
这是我的工作:
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);
});
}
文档中没有提到需要将 Redis 用于队列、缓存或任何类似性质的内容,除了“...应用程序可以与 Redis 服务器交互”。无论哪种方式,这是我的环境变量:
DB_CONNECTION=mysql
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=redis
我已经确认 RedisServiceProvider
正在接收它期望的正确配置:
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:"
]
]
]
我很难理解为什么没有运行时错误,只是什么都没有执行。如果我注释掉油门的东西,工作就会正常运行,并且会做它应该做的事情。 关于使用此限制的要求,我缺少什么?
在这种情况下 Laravel 的文档非常具有误导性。虽然这意味着您只需要连接到 Redis
,但实际上您必须为队列使用 Redis
。
不幸的是,如果不使用 Redis
队列驱动程序,就无法 "official" 对队列进行速率限制。
我写了自定义队列工作器 mxl/laravel-queue-rate-limit that uses Illuminate\Cache\RateLimiter
to rate limit job execution (the same one that used internally by Laravel to rate limit HTTP requests).
在 GitHub page or in this SO answer 上阅读有关其用法的更多信息。