Ограничение скорости очереди Laravel, не выполняющее работу - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь реализовать Ограничение скорости работы с очередями Laravel 5.7 , которое можно использовать, когда задания очереди сталкиваются с внешним 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. "В любом случае, вот мои варианты env:

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:"
    ]
  ]
]

Я изо всех сил пытаюсь понять, почему естьнет ошибок времени выполнения, просто ничего не выполняется.Если я закомментирую дроссельную заслонку, работа будет работать нормально и делать то, что должен делать. Чего мне не хватает в требованиях для использования этого регулирования?

Ответы [ 2 ]

0 голосов
/ 02 августа 2019

К сожалению, не существует «официального» способа оценивать очередь с ограничением без использования Redis драйвера очереди.

Я написал пользовательский обработчик очереди mxl / laravel-queue-rate-limit , которыйиспользует Illuminate\Cache\RateLimiter для ограничения скорости выполнения задания (то же самое, что внутренне использовалось Laravel для ограничения скорости HTTP-запросов ).

Подробнее об его использовании можно узнать на странице GitHub или этот SO ответ .

0 голосов
/ 12 марта 2019

Документация для Laravel в этом случае очень вводит в заблуждение.Хотя это подразумевает, что вам нужно только соединение с Redis, на самом деле вы должны использовать Redis для своих очередей.

...