2012-02-28 15 views
16

Estoy usando el método demorado_trabajo y me mudé a un servidor más robusto. Entonces ahora me gustaría ejecutar trabajos paralelos, como ahora I have the POWER!, pero estoy confundido sobre si el trabajo retrasado puede ejecutar múltiples colas en paralelo?Delayed_job - ¿Varias colas paralelas?

This question sugirieron que hay colas con nombre, pero ¿todas estas se ejecutan en una tabla y son secuenciales?

En la parte inferior @Jesse Wolgamott sugiere que puede crear una tabla para cada cola que luego se ejecutará en paralelo.

¿Alguien ha hecho esto y pueden indicarme cómo se hace?

+0

No, los trabajadores múltiples trabajan en paralelo, no de forma secuencial. Incluso si las colas están todas en una tabla, los trabajadores utilizarán la consulta sql para seleccionar las tareas en cola a las que están asignadas, ordenadas por 'run_at',' priority'. Por lo tanto, varios trabajadores pueden trabajar en diferentes partes de esa tabla en paralelo. – lulalala

+0

Olvidé la respuesta, así que agregué lo que uso y lo acepté. También volví a subir el otro ... – slotishtype

Respuesta

11

Con bundler en la producción:

RAILS_ENV=production bundle exec script/delayed_job -n 4 start

o sin bundler

ruby script/delayed_job -n 4 start

+1

No he probado la opción -i, pero la opción -n parece no funcionar cuando se está especificando una cola. Obtendrá varios trabajadores en ejecución, pero solo un trabajador aplicará a un hilo real. – Dex

+0

"-n 4" - ¡Este es un gran error! Use -n4, ¡sin espacio! He trabajado varias horas en eso. –

+0

@AndrewRukin la documentación menciona explícitamente -n 2 (con espacio ...) vea aquí: https://github.com/collectiveidea/delayed_job#running-jobs – rept

28

Es posible y lo estoy haciendo todo el tiempo. En nuestro caso, necesitamos múltiples trabajos para procesar tres tipos de trabajos diferentes, por ejemplo queue_a, queue_b y queue_c. El sistema hará las entradas en la tabla de retraso de trabajo y la cola nombrada apropiadamente.

Start varios trabajos retrasados ​​como

RAILS_ENV=production script/delayed_job -i first --queue=queue_a start 
RAILS_ENV=production script/delayed_job -i second --queue=queue_a start 
RAILS_ENV=production script/delayed_job -i third --queue=queue_b start 
RAILS_ENV=production script/delayed_job -i fourth --queue=queue_c start 

Cada comando creará un delayed_job, por lo que habrá ahora 4 trabajos paralelos, dos de ellos que sirven queue_a y uno cada uno para queue_b y queue_c. La clave aquí es el identificador que se pasa a través de la opción -i que especifica el nombre de la instancia, y podemos iniciar y detener trabajos según sea necesario.

Otra opción es usar pools de trabajadores.

RAILS_ENV=production script/delayed_job --pool=tracking --pool=mailers,tasks:2 --pool=*:2 start 

ese comando se iniciará 1 trabajador para la cola de seguimiento, 2 trabajadores para los anuncios publicitarios y tareas colas y 2 trabajadores para cualquier trabajo.

+0

¿Sabe si el último (2 trabajadores para cualquier trabajo) también aceptará trabajos de otras colas (seguimiento, remitentes, tareas) o solo trabajos en los que no se especificó cola? – Machisuji

+0

Creo que aquí se necesita una corrección para especificar varias instancias. La sintaxis debería ser así: RAILS_ENV = script de producción/delayyed_job --queue = queue_a -i one1 start, observe el espacio entre -i y el nombre de la instancia. – 3coins

+0

Gracias, este funcionó muy bien para mí ... ¡gracias! Todavía tengo que verificar la opción -n ... – Gnana

3

Si utiliza tareas rake como su mecanismo de lanzamiento trabajo, la variable de entorno cola puede ser utilizado para iniciar diferentes trabajos de trabajadores separados por cola.

Ejemplo:

QUEUE=email rake jobs:work 
QUEUE=build_data rake jobs:work 

La variable COLAS permite una retirada de cola de múltiples colas de DJ para un trabajador en particular.

QUEUES=build_data,email rake jobs:work 

particularmente útil si usted está utilizando un entorno de host/nube (por ejemplo Heroku) que da acceso limitado a lanzar directamente scripts/puestos de trabajo.

+0

No funciona, si configuro mis múltiples colas de trabajos paralelas de la siguiente manera: 'QUEUES = build_data, email rake jobs: work' y luego' QUEUE = another_data rake jobs: work' –