2011-03-28 31 views
33

tengo 2 tipo de tareas: Tipo 1 - Algunas de las tareas de alta prioridad pequeños. Tipo2 - Muchas tareas pesadas con menor prioridad.Apio - ejecutar diferentes trabajadores en un servidor

Inicialmente tenía una configuración simple con enrutamiento predeterminado, no se usaron claves de enrutamiento. No fue suficiente: a veces todos los trabajadores estaban ocupados con tareas de Type2, por lo que la Tarea1 se retrasó. teclas de enrutamiento que he añadido:

CELERY_DEFAULT_QUEUE = "default" 
CELERY_QUEUES = { 
    "default": { 
     "binding_key": "task.#", 
    }, 
    "highs": { 
     "binding_key": "starter.#", 
    }, 
} 
CELERY_DEFAULT_EXCHANGE = "tasks" 
CELERY_DEFAULT_EXCHANGE_TYPE = "topic" 
CELERY_DEFAULT_ROUTING_KEY = "task.default" 

CELERY_ROUTES = { 
     "search.starter.start": { 
      "queue": "highs", 
      "routing_key": "starter.starter", 
     }, 
} 

Así que ahora tengo 2 colas de tareas - con alta y baja prioridad.

El problema es - cómo iniciar 2 apéndices con diferentes configuraciones de simultaneidad?

Previamente apio se utilizó en modo demonio (de acuerdo to this), se requiere por lo que sólo inicio de /etc/init.d/celeryd start, pero ahora tengo que correr 2 celeryds diferentes con diferentes colas y concurrencia. ¿Cómo puedo hacerlo?

Respuesta

31

Parece que la respuesta, apio-múltiple, actualmente no está bien documentada.

Lo que necesitaba se puede hacer mediante el siguiente comando:

celeryd-multi start 2 -Q:1 default -Q:2 starters -c:1 5 -c:2 3 --loglevel=INFO --pidfile=/var/run/celery/${USER}%n.pid --logfile=/var/log/celeryd.${USER}%n.log 

Lo que hacemos está empezando 2 trabajadores, que están escuchando a diferentes colas (-Q: 1 es la opción predeterminada, Q es: 2 titulares) con diferentes concurrencias -c: 1 5 -c: 2 3

+0

¿Cómo puedo especificar nombre de los trabajadores ?? – holms

34

Basándome en la respuesta anterior, formulé el siguiente archivo/etc/default/apparel (originalmente basado en la configuración descrita en los documentos aquí: http://ask.github.com/celery/cookbook/daemonizing.html) que funciona para ejecutar dos trabajadores de apio en la misma máquina, cada trabajador repara una cola diferente (en este caso, los nombres de las colas son "predeterminados" e "importantes"))

Básicamente esta respuesta es sólo una extensión de la respuesta anterior, ya que simplemente muestra cómo hacer lo mismo, pero para el apio en modo demonio. Tenga en cuenta que estamos usando Django-apio aquí:

CELERYD_NODES="w1 w2" 

# Where to chdir at start. 
CELERYD_CHDIR="/home/peedee/projects/myproject/myproject" 

# Python interpreter from environment. 
#ENV_PYTHON="$CELERYD_CHDIR/env/bin/python" 
ENV_PYTHON="/home/peedee/projects/myproject/myproject-env/bin/python" 

# How to call "manage.py celeryd_multi" 
CELERYD_MULTI="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryd_multi" 

# How to call "manage.py celeryctl" 
CELERYCTL="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryctl" 

# Extra arguments to celeryd 
# Longest task: 10 hrs (as of writing this, the UpdateQuanitites task takes 5.5 hrs) 
CELERYD_OPTS="-Q:w1 default -c:w1 2 -Q:w2 important -c:w2 2 --time-limit=36000 -E" 

# Name of the celery config module. 
CELERY_CONFIG_MODULE="celeryconfig" 

# %n will be replaced with the nodename. 
CELERYD_LOG_FILE="/var/log/celery/celeryd.log" 
CELERYD_PID_FILE="/var/run/celery/%n.pid" 

# Name of the projects settings module. 
export DJANGO_SETTINGS_MODULE="settings" 

# celerycam configuration 
CELERYEV_CAM="djcelery.snapshot.Camera" 
CELERYEV="$ENV_PYTHON $CELERYD_CHDIR/manage.py celerycam" 
CELERYEV_LOG_FILE="/var/log/celery/celerycam.log" 

# Where to chdir at start. 
CELERYBEAT_CHDIR="/home/peedee/projects/cottonon/cottonon" 

# Path to celerybeat 
CELERYBEAT="$ENV_PYTHON $CELERYBEAT_CHDIR/manage.py celerybeat" 

# Extra arguments to celerybeat. This is a file that will get 
# created for scheduled tasks. It's generated automatically 
# when Celerybeat starts. 
CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule" 

# Log level. Can be one of DEBUG, INFO, WARNING, ERROR or CRITICAL. 
CELERYBEAT_LOG_LEVEL="INFO" 

# Log file locations 
CELERYBEAT_LOGFILE="/var/log/celerybeat.log" 
CELERYBEAT_PIDFILE="/var/run/celerybeat.pid" 
+0

¡Gracias! Esto fue muy útil. – Jacinda

+0

Acabas de salvarme la vida, en toda la red es tan difícil encontrar la configuración adecuada de esta bestia. ¡Necesitas crear un artículo de blog, miles estarían felices! – holms

11

Otra alternativa es dar al proceso de trabajo de un nombre único - con el argumento -n.

Tengo dos aplicaciones que se ejecutan en la pirámide el mismo hardware físico, cada uno con su propia instancia de apio (dentro de sus propias virtualenvs).

Ambos tienen Supervisor controlando ambos, ambos con un único archivo supervisord.conf.

app1:

[program:celery]            
autorestart=true            
command=%(here)s/../bin/celery worker -n ${HOST}.app1--app=app1.queue -l debug 
directory=%(here)s  

[2013-12-27 10:36:24,084: WARNING/MainProcess] [email protected] ready. 

app2:

[program:celery]         
autorestart=true         
command=%(here)s/../bin/celery worker -n ${HOST}.app2 --app=app2.queue -l debug 
directory=%(here)s        

[2013-12-27 10:35:20,037: WARNING/MainProcess] [email protected] ready. 
+0

Me gustaría hacer algo similar cuando tengo varias instancias de trabajador. Intenté leer la página de tareas de enrutamiento, pero no entiendo del todo. ¿Cómo enrutas las tareas a cada trabajador en particular? – Raj

+0

Las tareas se dirigen automáticamente al trabajador correcto porque los trabajadores de 'maz' están en un entorno virtual y los trabajadores de 'clockworkelves' están en otro entorno virtual. – maz

+0

Supongo que esta configuración podría funcionar si quiero que ambas instancias salgan de la misma cola. – ChrisC

Cuestiones relacionadas