настроить горизонт для множественной установки на одном сервере
Я предполагаю, что вы используете redis и Laravel Horizon, поэтому, прежде чем начинать настройку горизонта, просто очистите панель мониторинга горизонта от всех обработанных заданий в очереди с помощью следующей команды, которую я описал в учебнике, опубликованном в этой серии Эта ссылка:
php artisan flush:redis
Итак, теперь все ясно, и мы готовы изучить все следующие концепции от A до I.
Я предполагаю, что вы уже установили Horizon согласно его официальному документу. Чтобы понять, как профессионально настроить очередь Laravel, вы должны быть знакомы с этими простыми концепциями:
Концепция А:
В файле config / queue.php вы можете найти конфигурацию для драйвера подключения Redis.
'queue' => env('REDIS_QUEUE', 'default'),
Это означает, что если вы не укажете для задания «тип статуса очереди», оно получит статус по умолчанию, который теперь равен «defaul t».
Затем запустите:
php artisan horizon
Затем запускайте задание (я предполагаю, вы знаете, как запускать задание с помощью метода onQueue (). Если вы не знаете, отметьте эту ссылку). На панели инструментов Horizon вы увидите:
Внимание: очевидно, что значение retry_after должно быть больше, чем время, необходимое для выполнения задания. Тейлор установил его на 90 секунд.
Хлопайте! Поделиться этим! Следуйте за мной в Medium!
Концепция Б:
Вы можете установить (скажем, изменить) статус очереди по умолчанию для redis к любому имени по вашему желанию!
Сначала измените «default» на «foo» в config / queue.php для соединения redis.
'queue' => env('REDIS_QUEUE', 'foo'),
Затем очистите кеш конфигурации:
php artisan config:cache
Поэтому после запуска задания (я предполагаю, что вы не указываете для задания «тип состояния очереди» и оставляете метод onQueue () пустым), а затем выполните:
php artisan horizon
на панели управления Horizon вы увидите, что задание в очереди получит статус очереди foo. Обратите внимание на «Статус».
Как видите, задание в очереди не обрабатывается! Чтобы обработать его, следуйте следующей концепции.
Прежде чем продолжить чтение сброса этого руководства, я хочу представить вам Курс Laravel Core Adventures, который предоставил мой друг Кристоф Румпель. Если вы хотите стать мастером Laravel, я верю, что этот курс сэкономит вам много золотого времени! Щелкните здесь, чтобы увидеть более подробную информацию.
Концепция C:
Давайте посмотрим на файл конфигурации config / horizon.php. Вы увидите, что в конце файла есть два ключа массива. Один для Production и один для local. Выберите то, что вы хотите, в соответствии со средой, которую вы уже установили в .env файл.
Как в производстве, так и в локальном вы можете видеть, что статус очереди установлен как ' по умолчанию '.
Это означает, что если вы запустите горизонт с помощью команды artisan:
php artisan horizon
по умолчанию он обрабатывает только те задания, которые имеют 'default' статус очереди (скажем, приоритет). Хотя мы уже изменили статус очереди по умолчанию в соединении Redis в Концепции B с 'по умолчанию' на 'foo', и каждое запущенное задание получит 'foo 'в качестве статуса очереди.
Что мы можем сделать? Мы можем добавить «foo» к значениям статуса очереди, как показано ниже:
Таким образом, мы представляем то, что мы установили в config / queue.php как config / horizon.php.
Потом:
php artisan config:cache
а затем выполните:
php artisan horizon
и снова запустите это задание, и вы увидите:
Примечание.
До сих пор мы не указывали для задания «статус очереди», и каждое задание получает значение по умолчанию, которое предустановлено для драйвера redis.
Но мы можем установить значение в качестве статуса очереди для каждого задания в момент запуска этого задания, а не значение по умолчанию. Если вы этого хотите, давайте рассмотрим следующие концепции.
Хлопайте! Поделиться этим! Следуйте за мной в Medium!
Концепция D:
Приоритет или статус очереди - это просто * имя * и ничего более, т. е. когда вы устанавливаете "высокий" в качестве статуса очереди для задания, у него нет более высокий приоритет по сравнению с другими именами, и он не имеет никакого значения в Laravel , пока вы не определите свое точное значение. После того, как вы определите (я покажу позже), Laravel отправит задание с «высоким» статусом очереди в очередь с более высоким приоритетом.
Концепция E:
Как Laravel понимает приоритет каждого статуса очереди (значение очереди)?
Просто! Просто по его * порядку *, который входит в этот массив
'queue' => ['default','foo'],
Я покажу вам пример.
Порядок, в котором мы помещаем «значения статуса очереди»: «как мы расставляем их по приоритетам».
Пример:
Сначала остановите горизонт. Затем запускайте два задания в этом порядке, сначала Job1 (queue = foo), а затем Job2 (queue = default).
В концепции G я скажу, как задать имя .
Как видите, работы не обрабатываются. Так что бегите за горизонт с помощью команды artisan:
php artisan horizon
В терминале вы увидите:
Это означает, что Job2 имеет приоритет над Job1, то есть значение 'default' имеет приоритет над 'foo', просто из-за порядка, в котором они определены в массиве. Как видите, сначала идет "default", а затем "foo", как вы можете видеть ниже:
'environments' => [ 'production' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default','foo'], 'balance' => 'simple', 'processes' => 10, 'tries' => 3, ], ], 'local' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default','foo'], 'balance' => 'simple', 'processes' => 3, 'tries' => 3, ], ], ],
Примечание.
Если вы не используете горизонт, чтобы запустить рабочий процесс (который проверяет все обрабатываемые задания очереди «по умолчанию», прежде чем переходить к любому заданий в очереди 'foo'), передайте разделенный запятыми список имен очереди мастеру work команда:
php artisan queue:work --queue=default,foo
Обратитесь к документу Laravel здесь.
Хлопайте! Поделиться этим! Следуйте за мной в Medium!
Концепция F:
Вы можете назначить разные приоритеты (статус очереди) для разных заданий в очереди. Другими словами, вы можете определить приоритеты обработки ваших очередей.
В соответствии со следующими стилями у вас есть два варианта присвоения имени статусу очереди:
Стиль I:
Вы можете следовать стилю, который подразумевает тип приоритета, например:
«низкий», «высокий», «по умолчанию»
Стиль II:
Вы можете дать имя заданиям в очереди в зависимости от того, как вы их классифицируете, например:
"электронная почта", "визуализация", "изменение размера" и т. д.
Вопрос в том, где мы должны использовать каждый вид стилей? Ниже вы найдете ответ. Итак, следуйте Концепции H и Концепции I.
Концепция G:
Отправка в определенную очередь:
dispatch((new TheJob)->onQueue('foo'));
или используя метод dipatchNow, например:
TheJob::dispatchNow()->onQueue('foo'));
а также работают обе приведенные ниже команды.
PostPaymentJobTest::dispatch(); dispatch(new PostPaymentJobTest());
Я также опубликую новую статью или обновлю этот учебник для настройки статуса очереди для уведомлений Laravel. Будьте на связи!
Концепция H:
Давайте поговорим о «балансе» в файле конфигурации Laravel Horizon. В config / horizon.php вы видите:
'environments' => [ 'production' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'simple', 'processes' => 10, 'tries' => 3, ], ], 'local' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'simple', 'processes' => 3, 'tries' => 3, ], ], ],
Если вы хотите следовать стилю I, описанному в концепции F, вам следует отключить баланс и установить его false ", а не" простой ".
'queue' => ['high','default','low'], 'balance' => 'false',
Когда для параметра 'balance' установлено значение 'false', будет использоваться поведение Laravel по умолчанию, которое обрабатывает очереди в том * порядке *, который они перечислены в массиве очередей.
'queue' => [‘high’,‘default’,‘low’],
Сначала high
, затем default
и, наконец, low
Хлопайте! Поделиться этим! Следуйте за мной в Medium!
Концепция I:
Как вы видите в конфигурации горизонта, есть клавиша «процессы».
'processes' => 3,
Когда значение 'баланс отличается от' false ', значение' процессы 'будут иметь смысл, и вам следует следовать стилю II, описанному в концепции F.
В новом руководстве или обновлении я расскажу больше о том, «как Laravel выделяет ресурсы каждому процессу». Будьте на связи!
Важные заключительные примечания:
Примечание А.
- Каждый раз, когда вы редактируете свой код, вы должны завершить работу Horizon и перезапустить его.
Примечание Б:
- Если вы запускаете несколько установок Horizon на одном сервере, вы должны выбирать разные префиксы для каждой установки. В противном случае вы столкнетесь с некоторыми нервными проблемами.
В соответствии с тем, что задано в config / horizon.php, мы можем установить собственное значение в файле .env:
HORIZON_PREFIX = ApplicationName - горизонт:
или даже без настройки в файле .env мы можем отредактировать config / horizon.php примерно так:
'prefix' => env('APP_NAME').env('HORIZON_PREFIX', '-horizon:'),
Примечание C:
- Horizon будет отслеживать все очереди на всех серверах, обрабатывая только очередь, которая находится в файле конфигурации для каждого сервера. Поэтому для удобства использования настоятельно рекомендуется использовать разные списки статусов для каждой установки (или веб-сайта):
Как вы видите в Концепции B: мы можем даже установить foo (произвольное имя). Таким образом, мы можем использовать файл .env для установки конкретных имен очередей для каждого сервера, который должен работать, и мы запускаем «php artisan horizon» на каждом сервере.
Как видите, я установил этот массив в конфигурационном файле config / horizon.php для производства или локально:
'queue' => ['high','default','low'],
Теперь мы можем использовать собственные имена для каждой установки таким образом, чтобы в файле .env мы могли установить:
QUEUE_HIGH = ApplicationName -high
QUEUE_DEFAULT = ApplicationName -default
QUEUE_LOW = ApplicationName -low
и поместите в config / horizon.php что-то вроде этого:
'queue' => [ env('QUEUE_HIGH'), env('QUEUE_DEFAULT'), env('QUEUE_LOW'), ],
и не забудьте указать значение по умолчанию в config / queue.php для подключения Redis.
Примечание D.
- Это просто, но очень важно твердо запомнить:
Производственные настройки работают, если вы задаете в файле .env следующее:
APP_ENV = производство
а локальные настройки работают только в том случае, если вы установите в файле .env следующее:
APP_ENV = местный
Если вы устанавливаете что-то в производственной среде, вам следует также клонировать ее в локальной! В противном случае вы сойдете с ума, когда увидите, что ваши приложения не слушают вас, и между вашим сайтом на вашем локальном компьютере или на сервере возникает множество конфликтов.
Это также список доступных команд Laravel horizon:
Несколько советов:
- Если вы столкнулись с ошибкой при использовании задания Laravel и очереди, всегда проверяйте очередь
- Одно из различий между dispatch_now () и dispatch () заключается в том, что в первом вы можете использовать метод handle класса Job
Auth :: user (), а во втором - бессмысленно. - При передаче $ request в задание будьте осторожны, чтобы не сериализовать запрос. Сериализовать и десериализовать можно только красноречивую модель. См. Здесь: https://laravel.com/docs/5.2/queues#writing-job-classes Вы должны использовать $ request- ›all () вместо $ request. Поскольку запрос рассматривается как закрытие.
В конце, если вам понравилась эта статья:
Хлопайте! Поделиться этим! Следуйте за мной в Medium!