web-dev-qa-db-fra.com

Effacer la file d'attente sidekiq

J'ai ce travailleur qui court pour toujours.

class Worker
  include Sidekiq::Worker
  sidekiq_options queue: "infinity", retry: true

  def perform(params)
    # ...
    self.class.perform_in(30.seconds, params)
  end
end

Le problème est que je charge les travailleurs au démarrage, comme ceci. config/initializers/load_workers.rb

Rails.application.config.after_initialize do  
  if ENV["SIDEKIQ"] == "1"
    Worker.perform_async({})
  end
end

En utilisant ceci pour démarrer sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml.

Cela signifie que les anciens travailleurs doivent s’arrêter, tant ceux qui sont en cours d’emploi que ceux qui sont en train d’être reprogrammés.

J'ai essayé de l'exécuter au démarrage (juste avant de charger de nouveaux travaux), mais cela n'a pas fonctionné.

q = []
q += Sidekiq::RetrySet.new.select { |job| job.klass.match(/Worker/) }
q += Sidekiq::Queue.new("infinity").select { |job| job.klass.match(/Worker/) }
q += Sidekiq::ScheduledSet.new.select { |job| job.klass.match(/Worker/) }
q.each(&:delete)

Après les déploiements 5-ish, un groupe de travailleurs en double dans la file d'attente est planifié pour plus tard. Alors, y a-t-il un moyen d'effacer tout dans une file d'attente et d'empêcher la replanification de tâches en cours d'exécution?

J'utilise sidekiq 3.0.

69
Oleander

Supprime tous les travaux de la file d'attente en supprimant la file d'attente.

require 'sidekiq/api' # for the case of Rails console

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
131

Cela a fait le tour pour moi:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
46
iGEL

Fonctionne pour moi pour la plupart des versions de sidekiq:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

Effacer les statistiques (facultatif)

Sidekiq::Stats.new.reset
17
rusllonrails