Gerenciamento de filas assíncronas com Celery e Redis

Gerenciamento de filas assíncronas com Celery e Redis

O Celery é uma fila de tarefas assíncrona de trabalho, implementada em python, com base na passagem de mensagens distribuídas. Está focado na operação em tempo real, mas também oferece suporte ao agendamento. Aqui será tratado sobre essas filas, utilizando o redis como broker. Já o agendamento será tratado em outro post.

 

Why celery?

O celery tem uma sequência de vantagens e facilidades para a sua implantação, que facilitam o trabalho do desenvolvedor e ainda proporciona escalabilidade para sistemas. A seguir estão os pontos positivos de utilizá-lo.

  • O celery é utilizado em sistemas em produção para processar milhões de tarefas por dia;
  • Simples instalação e adaptação em aplicações;
  • Suporta vários categorias de Brokers: RabbitMQ, Redis, Amazon SQS, Zookeeper. Como dito antes, nesta aplicação iremos utilizar o Redis;
  • Fácil para integrar com aplicações Web utilizando Pacotes de Integração;
  • Grandes sistemas e aplicações utilizando: Mozzila, Instagram, AdRoll, entre outros.

Setup da Aplicação

Para instalar os pacotes em python, iremos utilizar o virtual env e o gerenciador de pacotes do python. Então antes de o instalar, vamos configurar o ambiente com estas ferramentas.

Instalando e Configurando o Virtualenv

virtualenvl

O virtualenv pode ser instalado através do gerenciador de pacotes do python, o pip. Assim, primeiramente iremos instalar em seu sistema operacional. Irei apresentar um exemplo de instalação em derivados do Debian. Mais informações sobre a instalação do pip podem ser encontradas no Site Oficial do pip.

# sudo apt-get install python3-pip python3 python-dev

Com o gerenciador de pacotes instalado, é possível instalar o virtual env.

$ pip install virtualenv

Agora podemos criar ambientes virtuais, que irá instalar os pacotes em uma pasta e não no sistema por inteiro. Assim, vamos criar uma pasta para o desenvolvimento, o nosso virtualenv e o ativá-lo.

$ cd ~
$ mkdir celery_queue
$ cd celery_queue
$ virtualenv .env
$ source .env/bin/activate

Desta forma, com o ambiente virtual instalado e ativado, todos os pacotes instalados pelo pip serão alocados dentro da pasta .env/libs.

Instalando o Celery

Após ativado o virtualenv, é muito simples instalar o Celery.

$ pip install Celery redis

Instalando Redis

A instalação do Redis para outros sistemas operacionais pode ser conferida no
site oficial do Redis. Porém, para a maioria dos casos, a instalação básica a seguir será feita corretamente.

redis

$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ cd redis-stable
$ make

Após estes procedimentos, basta apenas iniciar o Redis.

$ redis-server

Criando a primeira Task

As tasks do celery podem ser invocadas e enfileiradas. Para iniciar, o primeiro passo é criar um módulo que será decorado pelo celery como uma de suas tasks.

task

Vamos criar o arquivo a seguir com o seguinte código:

from celery import Celery
import time

app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def running(runner, vel):
    dist = 0
    while 1:
    time.sleep(2)
    dist += vel
    print("Corredor {0} esta em {1} metros".format(runner, dist))

Nas primeiras linhas existem os imports do celery e da biblioteca de time do python.

Logo após, é criada a instância do celery, passando o nome do worker(‘tasks’) e a url em que o broker atende, que no caso é: redis://localhost:6379/0.

Logo em seguida é criado um método que simula a distância em que um corredor está. O método recebe o nome do corredor e a sua velocidade. E a cada um segundo imprime o nome do corredor e quantos metros este já percorreu.

O interessante deste método é verificar que ao ser chamado várias vezes, será possível visualizar os corredores em suas posições atuais, representado as filas em execução.

Então, vamos ao teste. Para tal, vamos iniciar o worker com o nome da instância do celery que criamos no código: tasks.

$ celery -A tasks worker --loglevel=info

Pronto, o servidor do celery está funcionando e aguardando a solicitações de novas filas.

Para orquestrar as requisições, abra uma nova aba do terminal em sua máquina, ative o virtual env nessa nova máquina e inicie um terminal interativo do python.

$ source .env/bin/activate
$ python

Agora devemos importar o módulo tasks e assim poderemos utilizar o método.
Vamos utilizar três corredores com suas velocidades, em metros, diferentes.

  • Tiago Assunção com velocidade de 3m;
  • Leonardo Bites com velocidade de 4m;
  • Silvia Mendes com velocidade de 5m.

E a cada um segundo será apresentado na saída do worker do Celery a posição de cada um deles.

from tasks import running

running.delay('Tiago Assunção', 3)
running.delay('Leonardo Bites', 4)
running.delay('Silvia Mendes', 5)

Assim, na saída do worker é possível verificar os resultados do worker.

Corredor Tiago Assunção esta em 3 metros
Corredor Tiago Assunção esta em 6 metros
Corredor Tiago Assunção esta em 9 metros
Corredor Leonardo Bites esta em 4 metros
Corredor Tiago Assunção esta em 12 metros
Corredor Leonardo Bites esta em 8 metros
Corredor Tiago Assunção esta em 15 metros
Corredor Leonardo Bites esta em 12 metros
Corredor Silvia Mendes esta em 5 metros
Corredor Tiago Assunção esta em 18 metros
Corredor Leonardo Bites esta em 16 metros
Corredor Silvia Mendes esta em 10 metros
Corredor Tiago Assunção esta em 21 metros
Corredor Leonardo Bites esta em 20 metros
Corredor Silvia Mendes esta em 15 metros
Corredor Tiago Assunção esta em 24 metros
Corredor Leonardo Bites esta em 24 metros
Corredor Silvia Mendes esta em 20 metros
Corredor Tiago Assunção esta em 27 metros
Corredor Leonardo Bites esta em 28 metros
Corredor Silvia Mendes esta em 25 metros
Corredor Tiago Assunção esta em 30 metros
Corredor Leonardo Bites esta em 32 metros
Corredor Silvia Mendes esta em 30 metros

Conclusão

O celery é uma ótima ferramenta para a paralelização de atividades, que tem um grande suporte para escalabilidade.

Este tutorial explica apenas o começo do potencial desta ferramenta. Pois ela possui suporte para criar várias filas simultâneas com diferentes tasks. É possível limitar o número máximo de concorrência do worker. O celery cede suporte para cancelar as tasks programaticamente e possui um sistema de agendamento bastante completo. Todos estes pontos são assuntos de outros posts que virão.

Caso não deseje esperar os próximos posts, mas deseja saber mais sobre esta poderosa ferramenta, acesse a documentação oficial no próprio site do Celery.`

Anterior Certificações Linux - Um passo a frente nos processos seletivos
Próxima Instalação de uma Wiki em ambiente corporativo

About author

Você pode gostar também

Infraestrutura

Faça relay com Postfix e adicione HA em seus projetos

Aprenda nesse artigo  adicionar alta disponibilidade em seus projetos com Postfix com a inclusão de relay para encaminhar mensagens para mais de um servidor e garantir a operação

Infraestrutura

PAGILA – Base de dados educativa para PostgreSQL

Quando comecei aprender sobre banco de dados, senti falta de bases de dados prontas para fins de teste com o PostgreSQL. Eu queria aplicar conceitos aprendidos sobre SELECT, INSERT, UPDATE

Infraestrutura

Cluster Hadoop: aprenda a configurar

Nesse post vou explicar como é possível criar um cluster de hadoop utilizando 3 nodes. Já o que você vai fazer com o hadoop depois é um assunto pra um