Чтобы обрабатывать большое количество заданий, я запускаю переменное число работников очереди в зависимости от того, сколько работы нужно выполнить. Я не хочу привлекать больше работников, чем необходимо для выполнения работы, которую необходимо выполнить в течение периода времени, который мы считаем целесообразным.
На данный момент я запускаю 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
Я могу получить идентификаторы процессов для рабочих, и я мог бы убить процессы таким образом, но я не хочу убивать процесс в середине его работы на работе.
Благодарю.
Мы реализовали нечто подобное в нашем приложении, но это было не то, что было встроено в сам Laravel. Вы должны были бы отредактировать этот файл, добавив еще одно условие в блок if, чтобы он вызывал stop
функция. Вы можете сделать это, установив статическую переменную в Worker
класс, который изменяется каждый раз, когда вы запускаете пользовательскую команду, которую вам придется сделать (т.е. php artisan queue:pause
) или путем проверки атомарного значения где-то (т.е. установить его в некотором кэше, таком как redis, memcached, APC или даже MySQL, хотя это будет означать, что у вас будет один запрос MySQL для каждого цикла этого цикла while), который вы устанавливаете, используя та же самая пользовательская команда.
При использовании --daemon
работники флага не должны выходить, когда очередь пуста.
Я думаю, что вы ищете в документации по очередям.
php artisan queue:restart
Команда предложит работникам перезагрузиться после того, как они выполнят свою текущую работу.