2013-04-27 125 views
11

我不明白。每個sidekiq工人的多種方法

根據Sidekiq文檔,每個工人(我的稱爲FeedWorker)只能包含一個名爲perform的方法。那麼,如果我想通過同一個工作人員運行多種方法呢?

例如,我FeedWorker(你猜對了,它處理活動供稿)應運行以下3種方法:

announce_foo 
announce_bar 
invite_to_foo 

我不認爲這是不合理的期望。我相信其他人已經考慮到了這一點。我不是天才,但我知道我在這裏並沒有打破新的理想。然而,目前尚不清楚如何做到這一點。

現在,它看起來像我有這樣的代碼:

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

鏜醜陋的代碼。那裏一定有更好的。 任何幫助表示讚賞!

+0

你能鏈接到你發現這種說法的文檔頁嗎? – 2013-04-28 13:19:06

回答

5

perform方法是您的工人的入口點。在它內部,您可以根據自己的需要創建任意多個實例方法,根據需要組織代碼。儘管如此,儘可能保持工人代碼儘可能苗條,這是一個很好的做法。例如從內部調用其他對象是實現該目的的一種方式。你會發現你的代碼也會更容易測試。

+0

嘿法布里齊奧這確實是我做的。我已經接受了我的命運。至少感謝您的支持!希望其他有類似問題的人會受益。 – Laurent 2013-04-28 18:59:02

2

我有一段時間,同樣的問題,現在有一個相當簡單的解決方案:使用延遲擴展方法上的任何類,如docs解釋的,例如:

# 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 

任何類都被延遲,所以如果您不打算使用perform_async方法,則無需包含Sidekiq :: Worker。

我遇到的問題是每個工人的選項將不會被使用,除非你通過perform_async方法。

+0

儘管使用'.delay'位。我試圖用'sidekiq-throttler'進行節流,並且無法理解它爲什麼不節流。我的工作人員有多種方法,並使用'.delay'調用這些方法。 'sidekiq-throttler'使用了每個工作者的選項,就像你提到的那樣,除非經過'perform_async'調用,否則他們將無法工作。一旦我重構了我的代碼以擁有許多特定的工作人員,每個工作人員都有一個「執行」方法,則節流工作。 – Jack 2016-07-27 23:05:45