我目前使用延迟作业来异步处理作业。我没有使用.delay
方法,而是创建了工作人员。
我想转移到Sidekiq,但我有太多类型的工作,并且无法确保所有工作都是线程安全的。所以我想并行运行Delayed Job和Sidekiq,并一次迁移一种类型的作业。
由于Delayed Job和Sidekiq都提供.delay
方法,我如何区分这两者?还有其他潜在的问题吗?
答案 0 :(得分:27)
对于Sidekiq 2.17.1及更高版本,在Rails初始值设定项的某处,请调用以下内容:
Sidekiq.hook_rails!
Sidekiq.remove_delay!
并且您将只使用前缀sidekiq_delay
等方法。
对于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
库,直到你把所有工作都移到它上面。意思是尽可能避免同时包含两个库。