Очереди — один из тех инструментов Laravel, о котором все знают, но мало кто понимает их полностью. И это не удивительно, ведь многие впервые сталкиваются с очередями именно в Laravel, а они не так уж и просты, на самом деле.
К счастью, в Laravel 5.3 произошло совсем немного внешних изменений в работе с очередями.
Демон по умолчанию
Самое большое изменение в том, что команда, которой вы раньше пользовались для «прослушивания» задач в очереди:
shphp artisan queue:listen
...больше не является способом по умолчанию. Теперь способом по умолчанию является запуск shqueue:work
как демона:
shphp artisan queue:work
Раньше это можно было сделать при помощи запуска shphp artisan queue:work --daemon
, но теперь вам не надо передавать --daemon (наоборот, для работы с одной задачей передайте --once). Laravel рекомендует использовать по умолчанию shqueue:work
(стиль демона) вместо shqueue:listen
.
В чём разница?
Команда shphp artisan queue:listen
слушает вашу очередь и каждый раз запускает всё приложение для обработки каждой задачи из очереди. Это медленнее, зато не требует перезагрузки обработчика при каждом изменении кода.
Команда shphp artisan queue:work
сохраняет приложение запущенным между задачами, что делает его быстрее и легче, но вам необходимо перезапускать слушателя при каждом изменении кода. Лучший способ для этого — выполнять shphp artisan queue:restart
при каждом развёртывании.
Супервизор
Рекомендуется запускать процесс супервизора на ваших Linux-машинах для слежения за слушателем и его перезапуска, если он остановится. В документации появился раздел о правильной настройке супервизора.
Если коротко, то вы устанавливаете его с помощью shapt-get
, настраиваете его в файле /etc/supervisor/conf.d, и включаете перезапуск обработчика очереди, если он остановится. Вы можете задать даже количество обработчиков очереди для запуска в заданное время.
Под капотом
Последнее изменение — одно из самых прозрачных для нас, разработчиков: в новой инфраструктуре очередей у основного обработчика другая модель управления каждой задачей. Она сложнее, зато теперь у обработчика намного больше возможностей для контроля длительных задач в очереди и задач со сбоями в работе. А также новая система поддерживает pcntl_async_signals для PHP 7.1.
Напомню, вы можете управлять длительными задачами с помощью --timeout и retry_after; с помощью --timeout вы можете задать отведённое задаче время, и если процесс задачи превысит его, то будет «убит» своим родительским процессом — процессом обработчика очереди:
shphp artisan queue:work --timeout=90
Вы можете использовать --timeout совместно с retry_after (это настройка в конфигурационном файле очереди). retry_after задаёт то, как долго обработчик должен ждать перед тем, как решит, что задача провалена и должна быть помещена в очередь заново для повторной попытки. Как сказано в документации, не забудьте сделать retry_after хотя бы на несколько секунд больше, чем --timeout, чтобы избежать наложения нескольких копий одной задачи в очереди.
Заключение
Вот теперь всё! Всё описанное просто, но я считаю, что это делает всю настройку немного легче и более понятнее.