CLI Laravel Artisan безопасно останавливает работников очереди демонов

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

На данный момент я запускаю 5 рабочих из очереди демонов в целях тестирования, однако в производстве это число может быть между 25 & 100 рабочих, возможно, больше. Я понимаю, что при развертывании мне приходится останавливать работников очереди, сначала переводя инфраструктуру в режим обслуживания, используя php artisan down, поскольку --daemon Этот флаг заставляет платформу загружаться только при запуске работника, поэтому новый код не будет действовать во время развертывания до перезапуска работника.

Если бы мне нужно было по какой-то причине остановить работников, я мог бы перевести приложение в режим обслуживания, используя php artisan down что приведет к смерти рабочих, когда они закончат обработку своей текущей работы (если они работают). Однако могут быть случаи, когда я хочу убить рабочих, не переводя все приложение в режим обслуживания.

Есть ли безопасный способ остановить рабочих таким образом, чтобы они продолжали обрабатывать свою текущую работу, а затем умирали, не переводя все приложение в режим обслуживания?

По сути, мне нужно это php artisan queue:stop, который ведет себя как php artisan queue:restart, но не перезапускает работника после завершения работы.

Я ожидал, что там будет как php artisan queue:stop команда, которая сделает это, но это не так.

С помощью ps aux | grep php Я могу получить идентификаторы процессов для рабочих, и я мог бы убить процессы таким образом, но я не хочу убивать процесс в середине его работы на работе.

Благодарю.

12

Решение

Мы реализовали нечто подобное в нашем приложении, но это было не то, что было встроено в сам Laravel. Вы должны были бы отредактировать этот файл, добавив еще одно условие в блок if, чтобы он вызывал stop функция. Вы можете сделать это, установив статическую переменную в Worker класс, который изменяется каждый раз, когда вы запускаете пользовательскую команду, которую вам придется сделать (т.е. php artisan queue:pause) или путем проверки атомарного значения где-то (т.е. установить его в некотором кэше, таком как redis, memcached, APC или даже MySQL, хотя это будет означать, что у вас будет один запрос MySQL для каждого цикла этого цикла while), который вы устанавливаете, используя та же самая пользовательская команда.

2

Другие решения

При использовании --daemon работники флага не должны выходить, когда очередь пуста.

Я думаю, что вы ищете в документации по очередям.

php artisan queue:restart Команда предложит работникам перезагрузиться после того, как они выполнят свою текущую работу.

3