2013-04-27 7 views
11

Non capisco.metodi multipli per lavoratore sidekiq

Per documentazione Sidekiq, ogni operatore (il mio è chiamato FeedWorker) può contenere solo un metodo chiamato perform. Bene, cosa succede se voglio eseguire più metodi attraverso lo stesso operatore?

Per esempio, il mio FeedWorker (avete indovinato, si elabora un feed attività) dovrebbero eseguire i seguenti 3 metodi:

announce_foo 
announce_bar 
invite_to_foo 

non credo che questo è un'aspettativa irragionevole. Sono sicuro che altri lo abbiano considerato. Non sono un genio, ma so che non sto aprendo nuovi orizzonti nelle aspettative qui. Eppure non è chiaro come si farebbe questo.

In questo momento, sembra che devo codice in questo modo:

def perform(id, TYPE) 
    if TYPE == BAR 
    Bar.find(id) and_announce_bar 
    else 
    Foo.find(id) and_announce_foo 
    end 
end 

codice noioso e brutto. Ci deve essere meglio là fuori. Qualsiasi aiuto apprezzato!

+0

Puoi collegarti alla pagina dei documenti in cui hai trovato tale affermazione? –

risposta

5

perform metodo è il punto di ingresso del tuo Worker. Al suo interno è possibile creare tutti i metodi di istanza che si desidera, per organizzare il codice nel modo più adatto alle proprie esigenze. È comunque buona pratica mantenere il codice del lavoro il più snello possibile. Chiamare altri oggetti dall'interno di esso, ad esempio, è un modo per ottenerlo. Scoprirai che il tuo codice sarà più facile da testare.

+0

Ehi, Fabrizio, è proprio quello che ho fatto. E sono venuto a patti con il mio destino. Grazie almeno per avermi contattato! Speriamo che gli altri con domande simili possano trarne beneficio. – Laurent

2

ho avuto la stessa domanda per un po 'e ora hanno una soluzione piuttosto semplice: utilizzare il metodo di estensione in ritardo su qualsiasi classe, come spiegato in docs, ad es:

# Usage: EmailWorker.delay.do_something 

class EmailWorker 
    class << self 
    def send_this(attrs) 
     MyMailer.some_action(attrs).deliver 
    end 

    def send_that(attrs) 
     MyMailer.another_action(attrs).deliver 
    end 
    end 
end 

Ogni classe può essere ritardato, in modo da non è necessario includere Sidekiq :: Worker se non si utilizzerà il metodo perform_async.

Il problema che ho riscontrato è che le opzioni per lavoratore non verranno utilizzate a meno che non si passi al metodo perform_async.

+0

L'uso di '.delay' mi ha però bloccato. Stavo cercando di fare il throttling con 'sidekiq-throttler' e non riuscivo a capire perché non stesse strozzando. Ho avuto più metodi nel mio lavoratore e li ho chiamati usando '.delay'. 'sidekiq-throttler' usa quelle opzioni per lavoratore e, come hai detto tu, non funzioneranno se non attraverso le chiamate' perform_async'. Una volta refactored il mio codice per avere molti lavoratori specifici che ciascuno ha avuto il metodo one' perform', ha funzionato la strozzatura. – Jack