настроить горизонт для множественной установки на одном сервере

Я предполагаю, что вы используете 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!