Используя Laravel Horizon в Forge с Redis, у меня есть default
очередь и notifications
очередь.
Все задания уведомлений создаются с состоянием паузы под недавними заданиями и НЕ обрабатываются. Это код, используемый:
$event->owner->notify((new ItemWasLiked($event))->onQueue('notifications'));
Единственный способ, который я нашел для их обработки, — это вручную явно запустить следующую команду для notifications
обрабатывать:
php artisan queue:work --queue=notifications
Разве это не должно быть автоматическим, как оно приходит? Что мне не хватает?
Нам нужно поручить Horizon запустить работника очереди, который обрабатывает notifications
очередь в дополнение к default
очереди, добавив элемент в рабочую конфигурацию очереди в конфиг / horizon.php:
'environments' => [
...
'(environment name)' => [
'supervisor-1' => [
...
'queue' => [ 'default', 'notifications' ],
],
],
],
'queue'
Директива объявляет, какие очереди рабочий Horizon наблюдает за работой. В стандартной конфигурации указывается только default
очередь, поэтому работник будет обрабатывать только задания, помещенные в эту очередь. Выше примерно эквивалентно:
php artisan queue:work --queue=default,notifications
…где первая очередь в списке через запятую имеет самый высокий приоритет, а последняя очередь имеет самый низкий приоритет. Horizon расставляет приоритеты очередей, выделяя большую долю числа процессов, а не обрабатывая очереди в порядке приоритета.
В качестве альтернативы, мы можем добавить вторую рабочую группу в конфигурацию, которая обрабатывает вторую очередь:
'(environment name)' => [
'supervisor-1' => [
...
'queue' => [ 'default' ],
],
'supervisor-2' => [
...
'queue' => [ 'notifications' ],
],
],
…для которого Horizon запускает рабочие процессы очереди для каждой из двух очередей, которые запускаются одновременно.
Других решений пока нет …