2013-04-27 8 views
11

Ich verstehe es nicht.mehrere Methoden pro sidekiq Arbeiter

Pro Sidekiq-Dokumentation kann jeder Arbeiter (meiner heißt FeedWorker) nur eine Methode namens perform enthalten. Nun, was ist, wenn ich mehrere Methoden durch denselben Arbeiter ausführen möchte?

Zum Beispiel meine FeedWorker (Sie ahnen es, es verarbeitet ein Aktivitäts-Feed) sollten die folgenden drei Verfahren laufen:

announce_foo 
announce_bar 
invite_to_foo 

Ich glaube nicht, dass dies eine Zumutung ist. Ich bin mir sicher, dass andere Leute darüber nachgedacht haben. Ich bin kein Genie, aber ich weiß, dass ich hier keine neuen Wege beschreite. Es ist jedoch nicht klar, wie man das machen würde.

Gerade jetzt, es sieht aus wie ich auf diese Weise zu codieren haben:

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

Boring und hässlich Code. Da draußen muss es besser sein. Jede Hilfe wird geschätzt!

+0

Können Sie auf die Dokumentseite verweisen, auf der Sie eine solche Aussage gefunden haben? –

Antwort

5

perform Methode ist der Einstiegspunkt Ihrer Worker. Darin können Sie so viele Instanzmethoden erstellen wie Sie möchten, um Ihren Code so zu organisieren, wie er am besten passt. Es ist jedoch eine gute Übung, den Arbeitscode so schlank wie möglich zu halten. Wenn Sie beispielsweise andere Objekte von innen aufrufen, können Sie dies erreichen. Sie werden feststellen, dass Ihr Code auch einfacher zu testen ist.

+0

Hey Fabrizio, das ist in der Tat, was ich getan habe. Und ich habe mich mit meinem Schicksal arrangiert. Danke wenigstens für das Erreichen! Hoffentlich profitieren andere mit ähnlichen Fragen. – Laurent

2

hatte ich die gleiche Frage für eine Weile und haben jetzt eine ziemlich einfache Lösung: die verzögerte Erweiterung Methode für jede Klasse verwenden, wie in docs, für ex erklärt:

# 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 

kann Jede Klasse, so verzögert werden Sie müssen Sidekiq :: Worker nicht verwenden, wenn Sie die perform_async-Methode nicht verwenden möchten.

Das Problem, das ich damit hatte, ist, dass die pro-Arbeiter-Optionen nicht verwendet werden, es sei denn, Sie gehen durch die perform_async-Methode.

+0

Verwendung von '.delay' Bit mich obwohl. Ich versuchte Throttling mit 'sidekiq-throttler' zu machen und konnte nicht verstehen, warum es nicht gedrosselt wurde. Ich hatte mehrere Methoden in meinem Worker und nannte diese mit '.delay'. 'sidekiq-throttler' verwendet diese pro-worker-Optionen, und wie Sie bereits erwähnt haben, funktionieren sie nur, wenn Sie die' perform_async'-Aufrufe durchlaufen. Nachdem ich meinen Code so umstrukturiert hatte, dass er viele spezifische Worker hatte, die jeweils die "Perform" -Methode hatten, funktionierte das Throttling. – Jack