Запускать задержек и Sidekiq одновременно
В настоящее время я использую задержанную работу для асинхронного обработки заданий. Вместо создания рабочих я использую метод .delay
много.
Я хочу перейти на Sidekiq, но у меня слишком много типов заданий, и я не могу убедиться, что все они потокобезопасны. Поэтому я хочу запускать Delayed Job и Sidekiq параллельно и одновременно переносить один тип работы.
Поскольку как Delayed Job, так и Sidekiq предлагает метод .delay
, как я могу провести различие между ними? Есть ли другие потенциальные проблемы?
Ответы
Ответ 1
Для 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
для очереди в Delayed Job.
Ответ 2
Для тех, кто ищет это. Я обнаружил, что Sidekiq теперь имеет настройку для этого из коробки. Все вы
необходимо добавить Sidekiq.remove_delay!
в config/initializers/sidekiq.rb
Это описано здесь:
https://github.com/mperham/sidekiq/wiki/Delayed-Extensions
Ответ 3
Кажется, что Sidekiq имеет mix-in, который добавляет методы .delay
ко всем классам. Не 100% уверены, как это будет вести себя, но это может привести к проблемам, если delay
, на которые вы ссылаетесь, находится на уровне экземпляра.
Моим советом было бы добавить библиотеку sidekiq
для каждого задания, пока вы не переместили все свои задания на нее. Значение, чтобы избежать включения обеих библиотек одновременно, если возможно, снова.