Gerenciando Filas de Trabalho do Laravel com o Beanstalk e o Supervisor no Ubuntu 16.04

Você está aqui:
Tempo estimado de leitura: 3 min

O Beanstalk é uma fila de trabalho rápida e simples. Ele permite que você execute tarefas demoradas de forma assíncrona, como enviar e-mails, conectar-se a APIs externas ou processar imagens. Ao fazer isso, você reduzirá a latência de seu aplicativo da web. O Laravel fornece suporte pronto para uso beanstalkd.

Neste tutorial iremos instalar beanstalkd, configurar uma aplicação Laravel de demonstração e gerenciar os trabalhadores da fila através do Supervisor . O aplicativo de demonstração obterá uma lista de sistemas operacionais disponíveis da API da Site & Site e escolherá aleatoriamente um.

Supõe-se que você já tenha o Supervisor instalado em seu sistema. Se você não fizer isso, você deve ler o seguinte tutorial sobre como configurar o Supervisor: Instalando e Configurando o Supervisor no Ubuntu 16.04

Também é assumido que você tem acesso SSH à sua instância Site & Site.

Instalando o Beanstalk

O primeiro passo a tomar é instalar beanstalkd.

sudo apt-get update
sudo apt-get install beanstalkd

Inicie o serviço.

sudo systemctl start beanstalkd

Você também pode ativar o serviço para iniciar a inicialização do sistema.

sudo systemctl enable beanstalkd

Verifique o status do serviço emitindo o seguinte comando.

sudo systemctl status beanstalkd

Por padrão, beanstalkdescuta na porta 11300. O Beanstalk usa um protocolo baseado em texto simples descrito em seu repositório github . Você pode testar seu protocolo executando telnet.

telnet localhost 11300

Escreva o seguinte e clique em ENTER.

list-tubes

Você deve ver uma lista de tubos disponíveis no servidor:

OK 14
---
- default

Para fechar a conexão, simplesmente digite quite pressione ENTER.

Tubos no Beanstalk representam filas de trabalho. O Beanstalk é composto basicamente por produtores , consumidores , empregos e tubos . Os produtores colocam empregos em um tubo para serem consumidos (processados) por qualquer número de consumidores. Note que tanto os produtores quanto os consumidores são simplesmente clientes do servidor Beanstalk e são totalmente independentes uns dos outros. Em termos práticos, isso significa que usando o Beanstalk você pode produzir seus trabalhos em seu aplicativo PHP e processá-los em um aplicativo NodeJS, por exemplo. Felizmente, o Laravel abstrai tudo isso e nos fornece uma API muito simples para despachar e manipular tarefas, como veremos a seguir.

Projeto de amostra

Para construir nosso projeto de amostra, primeiro precisamos instalar suas dependências. Nós vamos instalar o PHP e o Composer.

sudo apt-get install php php-mbstring php-xml php-common php-zip composer

Agora, crie o projeto baseado no Laravel 5.5.

composer create-project --prefer-dist laravel/laravel vultr "5.5.*"

Avançar cdpara a pasta recém criada. Nós estaremos trabalhando neste diretório a partir de agora. Esta pasta pode ser referenciada posteriormente como PROJECT_ROOT.

cd vultr/

Para usar o Beanstalk no Laravel, precisamos instalar mais uma dependência, o cliente PHP Beanstalk.

composer require pda/pheanstalk ~3.0

Também precisamos criar uma representação de trabalho. No Laravel, esta é uma classe dentro da app/Jobspasta. O Laravel tem um comando de console para nos ajudar a criar uma classe de trabalho. Vamos criar nossa amostra de trabalho.

php artisan make:job FindFavoriteOS

Atualize o app/Jobs/FindFavoriteOS.phparquivo para o seguinte.

<?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 FindFavoriteOS implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $rawData = file_get_contents('https://api.vultr.com/v1/os/list');
        $list = json_decode($rawData, true);
        shuffle($list);
        $key = array_rand($list);
        $favorite = $list[$key];
        Log::info('My Favorite OS is: ' . $favorite['name']);
    }
}

O método de manipulação é o que será efetivamente executado quando o trabalho for consumido. Aqui, buscamos dados da API do Vultr, escolhemos aleatoriamente um sistema operacional e gravamos o sistema operacional escolhido no arquivo de log. O arquivo de log está localizado em storage/logs/laravel.log.

Nós já instalamos o Beanstalk e definimos o Job para ser executado por ele. Agora é hora de dizer ao Laravel para usar o Beanstalk como a fila de trabalho padrão. Copie o .envarquivo padrão fornecido pela instalação do Laravel.

cp .env.example .env

Agora abra o .envarquivo e atualize a linha onde o driver de fila está especificado.

QUEUE_DRIVER=beanstalkd

Por fim, gere uma chave de aplicativo.

php artisan key:generate

Agora estamos prontos para enviar trabalhos para a fila de trabalhos do Beanstalk.

Despachando e executando trabalhos

Despachar um emprego no Laravel é bem simples. Atualize o routes/web.phparquivo.

<?php

Route::get('/', function () {
    for ($i = 0; $i < 50; $i++) {
        \App\Jobs\FindFavoriteOS::dispatch();
    }

    return '50 Jobs dispatched!';
});

Apesar de não ser recomendado para executar o servidor fornecido em produção, nós o usaremos aqui por questões de brevidade.

php artisan serve --host 0.0.0.0 --port 8000

Agora, em um navegador da Web, navegue até http://[vultr-instance-ip]:8000. Você verá a seguinte mensagem.

50 Jobs dispatched!

Abra uma nova conexão SSH para o seu servidor e dentro da raiz do nosso projeto, execute o seguinte.

php artisan queue:work --once

Esta é a saída esperada:

[2018-02-14 00:03:52] Processing: App\Jobs\FindFavoriteOS
[2018-02-14 00:03:53] Processed:  App\Jobs\FindFavoriteOS

Confirme se o log foi gerado.

cat storage/logs/laravel.log

Configurando o Supervisor

Para evitar a necessidade de processar manualmente a fila, usaremos supervisord. Crie a seguinte configuração de programa em /etc/supervisor/conf.d/vultr.conf.

[program:vultr]
process_name=%(program_name)s_%(process_num)02d
command=php [PROJECT_ROOT]/artisan queue:work
autostart=true
autorestart=true
numprocs=8
redirect_stderr=true
stdout_logfile=/var/log/worker.log

Observe que o caminho certo para colocar o arquivo de configuração do Supervisor dependerá da sua configuração. Além disso, lembre-se de substituir [PROJECT_ROOT]com o caminho completo para o PROJECT_ROOTseu sistema.

Aqui estamos configurando o Supervisor para iniciar automaticamente o processamento da fila e, no caso de quebra de script, para reiniciá-lo. Observe também que não estamos instanciando um único trabalhador, mas 8 processos. Você é livre para instanciar quantos processos achar necessários, dependendo da sua aplicação.

Para permitir que o Supervisor gerencie nosso trabalhador, force-o a reler sua configuração.

sudo supervisorctl reread
sudo supervisorctl update

Se o serviço de supervisor não foi iniciado, muitos precisam iniciá-lo.

sudo systemctl start supervisord

Agora vamos ver se os trabalhos estão sendo processados.

tail -f storage/logs/laravel.log

Em um navegador da Web, navegue até http://[vultr-instance-ip]:8000. Você verá os logs sendo gerados no seu console.

Conclusão

Nós configuramos com sucesso um aplicativo Laravel para usar o Beanstalk como uma fila de trabalho. Além disso, demonstramos como usar o Supervisor para gerenciar os funcionários.

Esse artigo foi útil?
Não Gostei 0
Visualizações: 769

Ainda não Têm uma Conta?

Então Cadastre-se

Nome de Usuário*
E-mail*
Senha*
Confirmar Senha*

Já têm Uma Conta? Click Aqui.

Já tem uma Conta?

Ainda não tem Conta?