一个Sidekiq worker可以有多个方法

15

我不太明白。

根据Sidekiq文档,每个worker(我的称为FeedWorker)只能包含一个名为perform的方法。那么,如果我想通过同一个worker运行多个方法怎么办?

例如,我的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

代码无聊且难看。肯定有更好的选择。
感谢任何帮助!


你能链接到你找到这个声明的文档页面吗? - Fabrizio Regini
2个回答

7

perform方法是您的Worker的入口点。在其中,您可以创建尽可能多的实例方法,以最好地组织您的代码。不过,将worker代码保持尽可能简洁是一个好习惯。例如,在其中调用其他对象就是一种实现这一目标的方式。您会发现,这样做也会使您的代码更易于测试。


嗨,法布里齐奥,那确实是我所做的。我已经接受了自己的命运。至少感谢你的帮助!希望其他有类似问题的人也能从中受益。 - Laurent

3

我曾经也有同样的问题,现在有一个相当简单的解决方案:使用Delayed Extension方法在任何类上,如文档中所解释的那样,例如:

# 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方法,否则不会使用每个工作器选项。

使用.delay让我遇到了麻烦。我试图使用sidekiq-throttler进行节流,但无法理解为什么它没有起作用。我的worker中有多个方法,并使用.delay调用这些方法。sidekiq-throttler使用每个worker的选项,就像你提到的那样,除非通过perform_async调用,否则它们不起作用。一旦我重构了代码,使其具有许多具体的worker,每个worker都有一个perform方法,节流就起作用了。 - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接