Integrando projetos usando Celery Crossover

Recentemente precisamos integrar dois projetos utilizando celery, ou seja, um projeto X precisava chamar tasks de um projeto Y e o nosso líder técnico desenvolveu um projeto para isso, chamado celery-crossover.

Pode chegar um momento em que um projeto precisará integrar o celery de vários projetos, e é sobre isso o texto, integrar projetos de forma assincrona utilizando celery-crossover.

Preparando para o código:

$ mkdir -p exemplo/app1 exemplo/app2
$ cd exemplo
$ python -m venv .env
$ source .env/bin/activate
$ pip install celery celery-crossover

No diretório app1 vamos ter dois arquivos, app.py e celery_config.py. No app.py vai ter as tasks que serão compartilhadas para outros projetos celery e em celery_config.py terá as configurações para app.py.

No diretório app2 terá somente o arquivo app.py que irá consumir as tasks de app1.

app1/celery_config.py

from kombu import Exchange, Queue

BROKER_URL = 'redis://localhost:6379/1'
CELERY_QUEUES = [
    Queue('app_one_queue', Exchange('app_one_queue'), routing_key='app_one_queue')
]

No arquivo de configuração estamos colocando o broker que será utilizado pelo projeto.

app1/app.py

import crossover

from celery import Celery

app = Celery('tasks')
app.config_from_object('celery_config')

crossover.register_router(app)


@app.task(name='sum', queue='app_one_queue')
def sum(x, y):
    _add = x + y
    return _add

Aqui estamos importando o crossover, criando o app e o compartilhando usando o crossover.register_router, assim outros projetos poderão acessar as tasks de app1.

app2/app.py

from crossover import Client

app_one_broker = "redis://localhost:6379/1"
app_one_client = Client(broker=app_one_broker)

app_one_client.sum(x=340, y=1)

No app2 iremos configurar o mesmo endereço do broker com o mesmo banco de dados, importamos o Client do crossover e colocamos a configuração do broker.

Após isso você poderá acessar as tasks de app1 em app2.