同时运行延迟作业和Sidekiq

时间:2012-11-09 10:23:36

标签: ruby ruby-on-rails-3 delayed-job sidekiq

我目前使用延迟作业来异步处理作业。我没有使用.delay方法,而是创建了工作人员。

我想转移到Sidekiq,但我有太多类型的工作,并且无法确保所有工作都是线程安全的。所以我想并行运行Delayed Job和Sidekiq,并一次迁移一种类型的作业。

由于Delayed Job和Sidekiq都提供.delay方法,我如何区分这两者?还有其他潜在的问题吗?

3 个答案:

答案 0 :(得分:27)

对于Sidekiq 2.17.1及更高版本,在Rails初始值设定项的某处,请调用以下内容:

Sidekiq.hook_rails!
Sidekiq.remove_delay!

并且您将只使用前缀sidekiq_delay等方法。

official document


对于Sidekiq的旧版本:

将以下内容放入config/initializers/sidekiq.rb

module Sidekiq::Extensions::Klass
  alias :sidekiq_delay :delay
  remove_method :delay
  alias :sidekiq_delay_for :delay_for
  remove_method :delay_for
  alias :sidekiq_delay_until :delay_until
  remove_method :delay_until
end

module Sidekiq::Extensions::ActiveRecord
  alias :sidekiq_delay :delay
  remove_method :delay
  alias :sidekiq_delay_for :delay_for
  remove_method :delay_for
  alias :sidekiq_delay_until :delay_until
  remove_method :delay_until
end

module Sidekiq::Extensions::ActionMailer
  alias :sidekiq_delay :delay
  remove_method :delay
  alias :sidekiq_delay_for :delay_for
  remove_method :delay_for
  alias :sidekiq_delay_until :delay_until
  remove_method :delay_until
end

然后您可以使用sidekiq_delay在Sidekiq中排队,并调用delay在延迟作业中排队。

答案 1 :(得分:5)

对于任何寻找此事的人。我确实发现Sidekiq现在有一个开箱即用的设置。所有你 需要做的是将Sidekiq.remove_delay!添加到config/initializers/sidekiq.rb

这里描述: https://github.com/mperham/sidekiq/wiki/Delayed-Extensions

答案 2 :(得分:0)

Sidekiq似乎mix-in为所有类添加了.delay个方法。不是100%确定这将如何表现,但如果您引用的delay是在实例级别,则可能会导致问题。

我的建议是每个作业添加sidekiq库,直到你把所有工作都移到它上面。意思是尽可能避免同时包含两个库。