每个sidekiq工人有多种方法

时间:2013-04-27 19:39:19

标签: ruby-on-rails redis worker sidekiq

我不明白。

Per Sidekiq文档中,每个worker(我的名为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

无聊和丑陋的代码。那里一定有更好的。 任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:6)

perform方法是您的工作者的入口点。在其中,您可以根据需要创建任意数量的实例方法,以便根据您的需要组织代码。尽管让工作人员代码尽可能地保持苗条,但这是一个很好的做法。例如,从内部调用其他对象是实现这一目标的一种方法。您会发现您的代码也更容易测试。

答案 1 :(得分:3)

我有一段时间有同样的问题,现在有一个相当简单的解决方案:在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方法,否则不会使用每个工作者的选项。