Ларавель. Запускайте задание одного типа одновременно в одном из нескольких экземпляров

#php #laravel #queue

Вопрос:

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

php artisan queue:work --queue=high,default,low

Теперь мне нужно добавить еще один тип superlow , который должен быть однопоточным. Работники очереди должны выполнять этот тип задания только по одному и не позволять другим работникам выполнять его до тех пор, пока оно не будет завершено.

php artisan queue:work --queue=high,default,low,superlow

  1. Тип очереди таков database
  2. Я не смог найти такой вариант настройки в официальной документации

Комментарии:

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

2. Извините, если мое объяснение не совсем понятно. Допустим, у нас есть 10 сверхбыстрых рабочих мест и 5 рабочих. Один из рабочих поднимает его. Другие работники не возьмутся за какую-либо дополнительную работу, пока текущая не будет выполнена. По они могут выбрать высокий, низкий, по умолчанию в любое время.

3. Прямого способа сделать это нет, но вы можете «взломать» его, выполняя запланированную задачу каждую минуту на одном сервере и без перекрытия . Эта задача может быть чем-то вроде Artisan::call('queue:work --once --queue=superlow') или чем-то вроде этого.