2012-04-19 21 views
17

Estoy empezando a usar django-celery y me gustaría configurar apta para correr como daemon. Sin embargo, el instructions parece sugerir que se puede configurar solo para un sitio/proyecto a la vez. ¿Puede el Apio manejar más de un proyecto, o puede manejar solo uno? Y, si este es el caso, ¿hay una forma clara de configurar apiario para que se inicie automáticamente para cada configuración, lo que me obliga a crear un script de inicio separado para cada uno?¿Cómo usar apical como daemon con múltiples aplicaciones django?

Respuesta

8

Como todas las preguntas interesantes, la respuesta es depende. :)

Definitivamente es posible dar con un escenario en el que apical pueda ser utilizado por dos sitios independientes. Si varios sitios están enviando tareas al mismo intercambio y las tareas no requieren acceso a ninguna base de datos específica, es decir, operan en direcciones de correo electrónico, números de tarjetas de crédito o algo que no sea un registro de la base de datos, entonces un apio puede Ser suficiente. Solo asegúrese de que el código de la tarea se encuentre en un módulo compartido que carguen todos los sitios y el servidor de apio.

Por lo general, encontrará que el apio necesita acceso a la base de datos, ya sea que cargue objetos según la ID que se pasó como parámetro de la tarea, o tiene que escribir algunos cambios en la base de datos o la mayoría de las veces, ambos. Y múltiples sitios/proyectos generalmente no comparten una base de datos, incluso si comparten las mismas aplicaciones, por lo que deberá mantener las colas de tareas separadas.

En ese caso, lo que normalmente sucederá es que configure un solo intermediario de mensajes (RabbitMQ, por ejemplo) con múltiples intercambios. Cada intercambio recibe mensajes de un solo sitio. Luego ejecuta uno o más procesos apilados en algún lugar para cada intercambio (en la configuración de configuración de apio, debe especificar el intercambio. No creo que apical pueda escuchar múltiples intercambios). Cada servidor apical conoce su intercambio, las aplicaciones que debe cargar y la base de datos a la que debe conectarse.

Para gestionar esto, le sugiero que busque en cyme - Es por @asksol, y administra varias instancias apicales, en varios servidores si es necesario. No lo he intentado, pero parece que debería manejar diferentes configuraciones para diferentes instancias.

1

No probamos pero utilizando 3.1.x apio que no necesita django-apio, según la documentación se puede crear una instancia de una aplicación de apio como esto:

app1 = Celery('app1') 

app1.config_from_object('django.conf:settings') 
app1.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 


@app.task(bind=True) 
def debug_task(self): 
    print('Request: {0!r}'.format(self.request)) 

pero se puede utilizar de múltiples apio para el lanzamiento de varios trabajadores con configuración única cada uno, puede ver los ejemplos here. Así que usted puede lanzar varios trabajadores con diferentes --app Appx parámetros por lo que utilizará diferentes TAKS y ajustes:

# 3 workers: Two with 3 processes, and one with 10 processes. 
$ celery multi start 3 -c 3 -c:1 10 
celery worker -n [email protected] -c 10 --config celery1.py --app app1 
celery worker -n [email protected] -c 3 --config celery2.py --app app2 
celery worker -n [email protected] -c 3 --config celery3.py --app app3 
Cuestiones relacionadas