2012-02-13 7 views
7

Attualmente ho un progetto Rails 3.0, con Ruby 1.9.2 e Resque.Resque: one worker per queue

La mia applicazione ha più classi di lavoro e più code, che vengono create dinamicamente (durante il runtime). Inoltre, ci sono più lavoratori hanno iniziato che sono liberi di lavorare su eventuali code, perché al tempo di inizio, non v'è alcuna coda esistenti, e che non possono essere previsti:

$ COUNT=3 QUEUE=* rake resque:workers 

code un creato sulla base dei 's project id:

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

Per una determinata coda, i loro lavori devono essere elaborati in ordine e uno alla volta. Il mio problema è che, avendo più operatori, più processi vengono elaborati in parallelo.

C'è un modo per impostare il numero massimo di lavoratori per coda (su 1)? C'è un modo per bloccare una coda mentre un lavoro è in fase di elaborazione?

Grazie!

risposta

2

ho finalmente arrivato a una soluzione abbastanza semplice utilizzando resque-retry e si blocca memorizzati nel Redis (sto facendo questo per gli utenti, basta farlo per i progetti): https://stackoverflow.com/a/10933666/745266

+0

Sembra buono @lacco, grazie! Il tuo problema era molto simile al mio, quindi darò presto un'occhiata alla tua soluzione. –

1

La prima soluzione che ho pensato sarebbe quella di verificare se c'è un lavoratore che lavora in una determinata coda quando c'è un altro lavoratore che esegue il polling della stessa coda. Questo potrebbe essere fatto da reimplementare 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 possibile problema potrebbe essere la condizione di competizione. Pensieri?

+0

Ti è finalmente venuto a una soluzione, il codice funzionava in produzione? – lacco

+0

La soluzione si è rivelata molto più complicata di così e ho deciso di andare con un solo lavoratore per garantire la mia condizione. Ogni volta che le prestazioni diventano un problema, me ne preoccupo! : P –

1

Resque-pool può aiutare a specificare il numero di lavoratori per coda.

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

+0

Grazie Nick, ma questo non funziona per me, dato che le mie code sono create in runtime. –