【问题标题】:multiple methods per sidekiq worker每个 sidekiq 工作人员有多种方法
【发布时间】:2013-04-21 18:59:18
【问题描述】:

我不明白。

根据 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

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

【问题讨论】:

  • 您能否链接到您找到此类声明的文档页面?

标签: ruby-on-rails redis worker sidekiq


【解决方案1】:

perform 方法是你的 Worker 的入口点。在其中,您可以根据需要创建任意数量的实例方法,以最适合您的需要来组织代码。不过,保持工作代码尽可能精简是一个很好的做法。例如,从其中调用其他对象是实现此目的的一种方法。你会发现你的代码也更容易测试。

【讨论】:

  • 嘿 Fabrizio,这确实是我所做的。我已经接受了我的命运。至少感谢您伸出援手!希望其他有类似问题的人会受益。
【解决方案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 方法,否则不会使用 per-worker 选项。

【讨论】:

  • 虽然使用 .delay 咬我。我试图用sidekiq-throttler 进行节流,但不明白为什么它没有节流。我的工作人员中有多种方法,并使用.delay 调用这些方法。 sidekiq-throttler 使用每个工人的选项,就像你提到的那样,除非通过 perform_async 调用,否则它们将无法工作。一旦我重构我的代码以拥有许多特定的工作人员,每个工作人员都有一个 perform 方法,限制就起作用了。
猜你喜欢
  • 2013-11-05
  • 2013-02-28
  • 2013-07-10
  • 1970-01-01
  • 2018-11-05
  • 2015-10-16
  • 2012-09-30
  • 2013-12-30
  • 2012-10-05
相关资源
最近更新 更多