每个 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 工作人员有多种方法的主要内容,如果未能解决你的问题,请参考以下文章