Запускать задержек и 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 для каждого задания, пока вы не переместили все свои задания на нее. Значение, чтобы избежать включения обеих библиотек одновременно, если возможно, снова.