每个 sidekiq 工作人员有多种方法

Posted

技术标签:

【中文标题】每个 sidekiq 工作人员有多种方法【英文标题】:multiple methods per sidekiq worker 【发布时间】: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

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

【问题讨论】:

您能否链接到您找到此类声明的文档页面? 【参考方案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 方法,限制就起作用了。

以上是关于每个 sidekiq 工作人员有多种方法的主要内容,如果未能解决你的问题,请参考以下文章

工作中的 Sidekiq 重试计数

Sidekiq 工作人员正在泄漏内存

工作人员完成后 Sidekiq 未释放内存

Sidekiq 与连接到不同 Redis 实例的工作人员

Sidekiq 是不是按照发送给工作人员的顺序执行作业?

Sidekiq Rails 4.2使用活动作业还是工作者?有什么不同