2013-12-10 7 views

risposta

4

È possibile definire le dipendenze lavoro utilizzando Sidekiq Superworker:

# config/initializers/superworkers.rb 
Superworker.create(:MySuperworker, :user_id) do 
    Worker1 :user_id 
    Worker2 :user_id 
end 

# Anywhere 
MySuperworker.perform_async(123) 

Quando si esegue MySuperworker, worker1 avrà inizio. Al termine, verrà avviato Worker2. Ciò ti consente di separare il grafico delle dipendenze dagli stessi lavoratori. (Disclaimer: Sono l'autore della gemma.)

5

Utilizzare solo Sidekiq; la risposta sarebbe no. Come suggerito da DickieBoy, dovresti essere in grado di dargli il calcio d'inizio al termine del lavoro dipendente. Qualcosa come questo.

# app/workers/hard_worker.rb 
class HardWorker 
    include Sidekiq::Worker 

    def perform() 
    puts 'Doing hard work' 
    LazyWorker.perform_async() 
    end 
end 

# app/workers/lazy_worker.rb 
class LazyWorker 
    include Sidekiq::Worker 

    def perform(name, count) 
    puts "Guess it's time I do something" 
    end 
end 

Qui LazyWorker viene eseguito solo alla fine di HardWorker; logica aggiuntiva può essere aggiunta se questo non è sempre necessario; LazyWorker può ancora essere chiamato direttamente se/quando necessario. Questo dovrebbe funzionare per la maggior parte se non tutti i casi d'uso; e con Sidekiq è davvero la tua unica opzione a meno che tu non faccia un altro gioiello.


Quando si spara direttamente da un altro lavoro non è abbastanza buono ...

Se stai facendo qualcosa in cui questo non funziona si dovrebbe considerare una macchina a stati. Quando un lavoro viene licenziato, crea un record di sé stesso, probabilmente insieme a un ID e potrebbe avere stati in esecuzione, non riusciti, completati, in attesa. Il lavoro dipendente può quindi verificare facilmente una o più dipendenze nella tabella di stato e assicurarsi che tutte le dipendenze siano soddisfatte.

Sei lavoro dipendente potrebbe fare uno sguardo nella vostra tabella di stato per la dipendenza