Laravel Jobs не справляется с Redis при попытке использовать газ - PullRequest
0 голосов
/ 04 октября 2018

Конечная цель

Цель состоит в том, чтобы мое приложение отправляло потенциально большое количество писем в очередь Redis (этот бит работает), а затем Redis ограничивает их обработку до заданного количества писем.Каждое выбранное количество минут.

Для этого примера у меня есть тестовое задание, которое добавляет время к файлу, и я пытаюсь уменьшить его до одного раза каждые 60 секунд.

История такПока ....

Пока у меня есть приложение, успешно помещающее тестовое количество из 50 заданий в очередь Redis.Я могу войти в Horizon и увидеть эти 50 заданий в очереди «processjob».Я также могу войти в Redis-Cli и увидеть 50 наборов под ключом списка "queues: processjob".

Моя проблема в том, что, как только я пытаюсь поставить газ, запускается только 1 задание иошибка rest со следующей ошибкой:

Predis \ Response \ ServerException: ERR Ошибка запуска сценария (вызов f_29cc07bd431ccbf64637e5dcb60484560fdfa2da): @user_script: 10: WRONGTYPE Операция с ключом, содержащим неправильный тип значения в /var / www / html / smhub / vendor / predis / predis / src / Client.php: 370

Если я уберу газ, все рабочие файлы и 5 заданий будут немедленно запущены.

Я подумал, что это может быть неправильное имя ключа, но если я изменю следующее:

    public function handle()
{
    //
    Redis::throttle('queues:processjob')->allow(1)->every(60)->then(function(){

      Storage::disk('local')->append('testFile.txt',date("Y-m-d H:i:s"));
    }, function (){
      return $this->release(10);
    });
}

на следующее:

    public function handle()
{
    //
    Redis::funnel('queues:processjob')->limit(1)->then(function(){

      Storage::disk('local')->append('testFile.txt',date("Y-m-d H:i:s"));
    }, function (){
      return $this->release(10);
    });
}

, тогда все будет работать нормально.

Мои мысли ...

Что-то подсказывает мне, что проблема в том, что ключ redis имеет тип "list" и что все задания находятся в одном списке.При этом, если бы это не сработало таким образом, как бы мы дросселировали очередь, поскольку для дросселя требуется уникальный ключ.

1 Ответ

0 голосов
/ 09 октября 2018

Для всех, кто испытывает проблемы с попыткой заставить это работать и получает ту же проблему, что и я, вот что решило мои проблемы:

Ошибка

Я предположил, чтоRedis::throttle('queues:processjob') должен был относиться к очереди, которую вы хотите ограничить.Однако после некоторого перечитывания документации и тестирования кода я понял, что это не так.

Исправление

Redis::throttle('queues:processjob') предназначено для указания на свою собственную «удерживающую» очередь и поэтому должно быть уникальным именем ключа Redis.Поэтому изменение его на Redis::throttle('throttle:queues:processjob') отлично сработало.

Работа

Когда я впервые посмотрел на это, я предположил, что это Redis::throttle('this') задушило указанную вами очередь.В некоторой степени это правильно, но не будет работать, если задание было создано с помощью другого средства.

Redis::throttle('this') фактически создает новую очередь хранения, в которой задания выполняются до тех пор, пока не будут выполнены указанные условия.Таким образом, задания будут идти в очередь 'this' в этом примере, и когда триггер газа будет отпущен, они будут переданы в очередь, указанную в их коде выполнения.В этом случае 'queues: processjob'.

Надеюсь, это поможет!

...