我目前使用Delayed Job来异步处理任务。与创建工作进程不同,我经常使用.delay
方法。
我想要转移到Sidekiq, 但是我的作业类型太多了,我不能确定它们都是线程安全的。因此我想并行运行Delayed Job和Sidekiq,并逐个迁移一种类型的作业。
由于Delayed Job 和 Sidekiq 均提供了 .delay
方法,那么如何区分两者?还有其他潜在问题吗?
我目前使用Delayed Job来异步处理任务。与创建工作进程不同,我经常使用.delay
方法。
我想要转移到Sidekiq, 但是我的作业类型太多了,我不能确定它们都是线程安全的。因此我想并行运行Delayed Job和Sidekiq,并逐个迁移一种类型的作业。
由于Delayed Job 和 Sidekiq 均提供了 .delay
方法,那么如何区分两者?还有其他潜在问题吗?
对于Sidekiq 2.17.1及更高版本,在Rails的初始化程序中的某个地方调用以下内容:
Sidekiq.hook_rails!
Sidekiq.remove_delay!
对于旧版本的Sidekiq:
将以下内容放入config/initializers/sidekiq.rb
文件中,您将只拥有带前缀的sidekiq_delay
方法等。
(官方文档)
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
将任务加入到Delayed Job队列中。
config/initializers/sidekiq.rb
文件中添加Sidekiq.remove_delay!
即可。看起来Sidekiq有mix-in,可以为所有类添加.delay
方法。不太确定它的行为,但如果引用的delay
在实例级别上,则可能会导致问题。
我的建议是每个作业都添加sidekiq
库,直到将所有作业移动到它。这意味着尽可能避免同时包含两个库。