2012-02-13 12 views
7

Actualmente tengo un proyecto de Rails 3.0, con Ruby 1.9.2 y Resque.Resque: un trabajador por cola

Mi aplicación tiene varias clases de trabajadores y múltiples colas, que se crean dinámicamente (durante el tiempo de ejecución). Además, hay varios trabajadores comenzaron que están libres para trabajar en las colas, porque en tiempo de inicio no hay ninguna colas existentes, y que no se pueden predecir:

$ COUNT=3 QUEUE=* rake resque:workers 

colas un ser creado sobre la base de los project 's id:

@queue = "project_#{project.id}".to_sym 

Para una cola determinada, sus trabajos tienen que procesarse en orden y de a uno por vez. Mi problema es que, al tener varios trabajadores, se procesan varios trabajos en paralelo.

¿Hay alguna forma de establecer el número máximo de trabajadores por cola (a 1)? ¿Hay alguna manera de bloquear una cola mientras se está procesando un trabajo?

Gracias!

Respuesta

2

Finalmente llegué a una solución bastante simple usando resque-reintento y cerraduras almacenados en Redis (que estoy haciendo esto para los usuarios, sólo lo hacen para proyectos): https://stackoverflow.com/a/10933666/745266

+0

Se ve bien @lacco, gracias! Tu problema fue muy similar al mío, así que definitivamente voy a echar un vistazo a tu solución pronto. –

1

La primera solución que pensé sería comprobar si hay algún trabajador trabajando en una cola determinada cuando hay otro trabajador encuestando esa misma cola. Esto podría hacerse por reimplementar Resque::Job.reserve(queue):

module Resque 
    class Job 

    def self.reserve(queue) 

     Resque::Worker.working.each do |worker| 
     # if already working in the same queue 
     if worker.job['queue'] == queue 
      return 
     end 
     end 

     return unless payload = Resque.pop(queue) 
     new(queue, payload) 
    end 

    end 
end 

Un posible problema sería la condición de carrera. ¿Pensamientos?

+0

¿Finalmente llegó a una solución, ¿el código trabajó en producción? – lacco

+0

La solución resultó ser mucho más complicada que eso y decidí ir con un solo trabajador para garantizar mi condición. ¡Cuando el rendimiento se convierte en un problema, me preocuparé por ello! : P –

1

Resque-pool puede ayudarlo a especificar el número de trabajadores por cola.

https://github.com/nevans/resque-pool

+0

Gracias Nick, pero eso no funciona para mí, ya que mis colas se crean en tiempo de ejecución. –

Cuestiones relacionadas