【问题标题】:Run Delayed Jobs and Sidekiq at the same time同时运行延迟作业和 Sidekiq
【发布时间】:2012-10-29 15:55:04
【问题描述】:
我目前使用延迟作业来异步处理作业。我没有创建工人,而是经常使用.delay 方法。
我想搬到 Sidekiq,但我有太多类型的工作,无法确保所有工作都是线程安全的。所以我想并行运行 Delayed Job 和 Sidekiq,一次迁移一种类型的作业。
既然 Delayed Job 和 Sidekiq 都提供.delay 方法,我该如何区分两者?还有其他潜在问题吗?
【问题讨论】:
标签:
ruby
ruby-on-rails-3
delayed-job
sidekiq
【解决方案1】:
对于 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 在延迟作业中排队。
【解决方案3】:
似乎 Sidekiq 有 mix-in 将 .delay 方法添加到所有类。不能 100% 确定这将如何表现,但如果您所指的 delay 位于实例级别,则可能会导致问题。
我的建议是为每个作业添加 sidekiq 库,直到您将所有作业移至其中。意思是避免同时包含两个库,如果可能的话。