Использование навыков очереди очереди в Laravel

Laravel

Очереди Laravel предоставляют унифицированный API для различных фоновых служб очередей, таких как Beanstalk, Amazon SQS, Redis и даже других очередей на основе реляционных баз данных. Целью очередей является отсрочка трудоемких задач, таких как отправка электронных писем, тем самым резко сокращая веб-запросы и соответствующее время.

Файл конфигурации очереди хранится в config/queue.php. В этом файле можно найти каждую конфигурацию драйвера очереди, включая драйверы базы данных, Beanstalkd, Amazon SQS, Redis и синхронизации (локально используемые). Он также содержит драйвер нулевой очереди для задач, которые покидают очередь.

Зачем использовать очереди?

Как правило, очереди используются для:

异步
重试

Возможно, у вас есть другие причины использовать очереди, но это должны быть две самые основные причины.

Когда использовать очереди?

Зная, почему используются очереди, обычно есть несколько типов задач, в которых используются очереди:

Это занимает много времени, например, загрузка файла и конвертация некоторых форматов. Если скорость доставки должна быть гарантирована, например, при отправке текстового сообщения, всегда будет вероятность сбоя, если вы хотите вызвать чужой API, поэтому для обеспечения доставки необходима повторная попытка. При использовании очереди вы должны понимать вопрос, может ли эта задача быть асинхронной, если асинхронность вызовет проблемы, то вы должны отказаться от использования очереди.

Необходимые настройки для драйвера

database.php

Настройте часть базы данных redis в файле конфигурации database.php, по умолчанию есть соединение по умолчанию, просто используйте это :)

В соответствии с элементами конфигурации, необходимыми в этом соединении по умолчанию, отредактируйте файл конфигурации .env и заполните Redis_Host, Redis_Password и Redis_Port с соответствующими значениями Redis на своем собственном сервере.

queue.php

Во-первых, вам нужно настроить QUEUE_DRIVER в .env.Поскольку Redis будет использоваться сейчас, он настроен как Redis.

Затем настройте соединение Redis в разделе соединений файла queue.php, где значение, соответствующее соединению, — это соединение Redis по умолчанию в файле database.php.

база данных

Чтобы использовать драйвер очереди базы данных, вам необходимо создать таблицу данных для хранения задач. Вы можете использовать очередь: стол этого мастера

php artisan queue:table

Обработка неудачных задач

Иногда задачи в вашей очереди не выполняются. Не волнуйтесь, все будет не так гладко.

Laravel имеет встроенный способ указать максимальное количество задач, повторите попытку. Когда задача превышает эту повторное повторное тестирование, она будет вставлена ​​в лист данных Failed_jobs. Чтобы создать файл миграции таблицы Failed_jobs, вы можете использовать очередь: сбойную команду таблицы, затем используйте команду migrate artisan для генерации таблицы failed_jobs:

php artisan queue:failed-table

команда для создания миграции для этой таблицы данных. После создания миграции вы можете использовать команду migrate для создания таблицы данных:

php artisan migrate

Выполнить объяснение команды

php artisan queue:work --daemon --quiet --queue=default --delay=3 --sleep=3 --tries=3
--daemon

The queue:work Artisan command includes a --daemon option for forcing the queue worker to continue processing jobs without ever re-booting the framework. This results in a significant reduction of CPU usage when compared to the queue:listen command

Как правило, эта опция обычно добавляется в супервизор для экономии ресурсов ЦП.

--quiet

ничего не выводить

--delay=3

После сбоя задачи укажите время задержки перед повторной попыткой в ​​секундах. Я лично рекомендую, чтобы установка этого значения не была слишком короткой, потому что задача завершается сбоем (например, по сетевым причинам), а время повторной попытки слишком короткое, что может привести к постоянным сбоям.

--sleep=3

Когда я пошел получать задачу в Redis, я обнаружил, что задачи нет.Сколько времени на отдых в секундах. Установка этого значения зависит от того, является ли ваша задача срочной.Если это очень срочная задача, вы не можете ждать слишком долго.

--tries=3

Это не удалось в задаче до количества повторных попыток. Эта настройка определяется в зависимости от важности задачи, как правило, подходит в три раза больше.

Создать задачу

Создать класс задач

В вашем приложении классы заданий для очередей по умолчанию размещаются в каталоге app/Jobs. Если этот каталог не существует, он будет создан автоматически при выполнении Artisan-команды make:job. Вы можете создать новую задачу в очереди с помощью следующей Artisan-команды:

php artisan make:job Demo

Сгенерированный класс реализует интерфейс Illuminate\Contracts\Queue\ShouldQueue, что означает, что задача будет помещаться в очередь, а не выполняться синхронно.

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;

class Demo implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $param;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($param = '')
    {
        $this->param = $param;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Log::info('Hello, '.$this->param);
    }
}

код контроллера

public function queue_demo()
{
    $num = rand(1,999999999);
    // 这个任务将被分发到默认队列...
    DemoJob::dispatch($num);
}

открытая очередь

php artisan queue:work --queue=default

Поскольку он является локальным, необходимо открыть монитор, при доступе к интерфейсу это заставит очередь задач

нужно использовать онлайнsupervisorКонфигурация

Конфигурация супервизора

Установить супервизор

Supervisor — это программное обеспечение для мониторинга процессов в операционной системе Linux, которое автоматически перезапускает команды queue:listen или queue:work после сбоя. Чтобы установить Supervisor в Ubuntu, используйте следующую команду:

sudo apt-get install supervisor

{tip} Если настройка Supervisor самостоятельно кажется сложной задачей, рассмотрите возможность использования Laravel Forge, который автоматически устанавливает и настраивает Supervisor для ваших проектов Laravel.

Настройка супервизора

Файлы конфигурации супервизора обычно размещаются в каталоге /etc/supervisor/conf.d. В этом каталоге вы можете создать любое количество конфигурационных файлов, чтобы спросить супервизора, как контролировать ваши процессы. Например, мы создаем laravel-worker.conf для запуска и мониторинга процесса queue:work:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

Команда numprocs в этом примере попросит Supervisor запустить и контролировать 8 процессов очереди: рабочие и перезапустить их в случае сбоя. Конечно, вы должны изменить очередь: work sqs команды command, чтобы показать драйвер очереди по вашему выбору.

Запустить супервизор После создания этого файла конфигурации вам необходимо обновить конфигурацию Supervisor и запустить процесс с помощью следующей команды:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*

Запустите супервизор перед использованием команды управления процессами супервизора, иначе программа сообщит об ошибке. использовать командуsupervisord -c /etc/supervisord.confзапускать.

Информацию о настройке и использовании Supervisor см. в разделе Supervisor.официальная документация

Общая проблема

  1. unix:///var/run/supervisor.sock no such file

    Описание проблемы: ошибка, о которой сообщалось при использовании supervisorctl напрямую без запуска службы после установки супервизора.

    Решение:supervisord -c /etc/supervisord.conf

  2. Процесс, указанный в команде, запущен, но супервизор продолжает перезапускаться

    Описание проблемы: Способ запуска в команде - фоновый запуск, из-за чего pid не распознается, а потом постоянно перезагружается.Здесь используется elasticsearch, и команда указывает$path/bin/elasticsearch -d

    Решение: супервизор не может определить pid процесса фонового запуска, а сам супервизор является демоном фонового запуска, так что не беспокойтесь об этом.

  3. После нескольких руководящих услуг, в результате чего обычный сервис не может быть закрыт

    Описание проблемы: работаетsupervisord -c /etc/supervisord.confПеред запуском напрямуюsupervisord -c /etc/supervisord.d/xx.confВ результате некоторыми процессами управляет несколько супервизоров, и процессы не могут быть нормально завершены.

    Обходной путь: используйтеps -fe | grep supervisordПросмотрите все запущенные службы супервизора и завершите связанные с ними процессы.

Ссылка на конкретный образец кодарепозиторий github