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 上阅读有关其用法的更多信息。