Effacer la file d'attente sidekiq

93

J'ai cet ouvrier 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 ouvriers au démarrage, comme ça. config/initializers/load_workers.rb

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

Utiliser 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, à la fois ceux en cours d'exécution mais aussi ceux en cours de rééchelonnement.

J'ai essayé de l'exécuter au démarrage (juste avant de charger de nouvelles œuvres), 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, il y a un tas de travailleurs en double dans la file d'attente prévue pour plus tard. Alors, y a-t-il un moyen de vider tout dans une file d'attente et d'empêcher les travaux déjà en cours de replanifier?

J'utilise sidekiq 3.0.

Linus Oleander
la source
Voulez-vous supprimer une file d'attente ou un travail planifié. ou mieux pour dire travail planifié en double.
Sabyasachi Ghosh
Je souhaite supprimer toutes les traces d'un travail avant de charger le nouveau travailleur.
Linus Oleander
ok obtenu votre problème .. signifie que vous souhaitez supprimer tous les travaux planifiés.
Sabyasachi Ghosh
@haSabyasachiGhosh Non, je veux supprimer tout ce qui est lié à une file d'attente, pas seulement les travaux planifiés. En d'autres termes; les travaux échoués, en cours, en attente et planifiés doivent être supprimés.
Linus Oleander
Toute l'aide est ici - github.com/mperham/sidekiq/wiki/API
viks

Réponses:

161

Supprime tous les travaux d'une 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
Ranjithkumar Ravi
la source
Peut-être que Sidekiq Pro vous aidera.
Ranjithkumar Ravi
5
Voici pour effacer les compteurs, Sidekiq::Stats.new.resetje découvre que cela aide
14
Pour effacer la file d'attente par défaut / première:Sidekiq::Queue.all.first.clear
user456584
1
Sidekiq :: Queue.new ("rapports"). Clear et Sidekiq :: Queue.new ("alertes"). Clear permet d'effacer la file d'attente actuelle. Mais qu'en est-il Busy? Comment effacer les tâches "Occupé"?
Donato
31
Effacez-les tous avecSidekiq::Queue.all.each &:clear
Marco Lazzeri
95

Cela a fait l'affaire pour moi:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
iGEL
la source
1
Merci, cela a fonctionné comme un charme, j'étais dans une urgence haha, l'acolyte était avec waaaaaay trop de travailleurs dans la file d'attente cela a fonctionné comme je kill
m'y
Parfait, juste en ajoutant que dans mon env, je devais require 'sidekiq/api'travailler sur console.
bonafernando le
19

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
rusllonrails
la source
Cela vide toute la base de données, pas seulement la file d'attente.
Linus Oleander
si va vider toute la base de données de sidekiq, et fonctionnera bien dans la console rails
vidur punj
-2

Vous pouvez effacer votre file d'attente en exécutant ce code bien qu'il y ait des méthodes intégrées.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end
Asad Hameed
la source
Eh bien, cela devrait fonctionner car nous avons récupéré tous les travaux de la file d'attente, puis les avons supprimés un par un.
Asad Hameed
Non, ce n'est pas le cas. Jetez un œil aux réponses existantes. C'est aussi un double de la réponse existante.
Linus Oleander
Je ne sais pas de quoi tu parles. Pouvez-vous s'il vous plaît me montrer la même réponse que j'ai publiée?
Asad Hameed