我目前使用延迟作业来异步处理作业。我没有创建工人,而是经常使用这种.delay
方法。
我想搬到 Sidekiq,但我有太多类型的工作,无法确保所有工作都是线程安全的。所以我想并行运行 Delayed Job 和 Sidekiq,一次迁移一种类型的作业。
由于 Delayed Job 和 Sidekiq 都提供了该.delay
方法,我该如何区分两者?还有其他潜在问题吗?
我目前使用延迟作业来异步处理作业。我没有创建工人,而是经常使用这种.delay
方法。
我想搬到 Sidekiq,但我有太多类型的工作,无法确保所有工作都是线程安全的。所以我想并行运行 Delayed Job 和 Sidekiq,一次迁移一种类型的作业。
由于 Delayed Job 和 Sidekiq 都提供了该.delay
方法,我该如何区分两者?还有其他潜在问题吗?
对于 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
在延迟作业中调用队列。
对于任何寻找这个的人。我确实发现 Sidekiq 现在有一个开箱即用的设置。您需要做的就是添加Sidekiq.remove_delay!
到config/initializers/sidekiq.rb
此处对此进行了描述: https ://github.com/mperham/sidekiq/wiki/Delayed-Extensions
似乎 Sidekiq 具有向所有类添加方法的混合功能。不是 100% 确定这将如何表现,但如果您指的是实例级别,.delay
它可能会导致问题。delay
我的建议是为sidekiq
每个作业添加库,直到您将所有作业移至其中。意思是避免同时包含两个库,如果可能的话。