Comment effacer tous les jobs de Sidekiq?

119

J'utilise sidekiq pour les tâches d'arrière-plan dans l'application Rails. Maintenant, le nombre d'emplois augmente, donc je veux effacer tous les emplois. J'ai essayé la commande suivante dans la console

Sidekiq::Queue.new.clear

mais il donnait l'erreur suivante.

NameError: uninitialized constant Sidekiq::Queue 

Comment effacer tous les jobs de sidekiq?

Peut Can
la source
essayer include 'sidekiq'avant
Benj
@BenjaminSinclaire donne TypeError: mauvais type d'argument String (module attendu)
Can Can
3
essayer require 'sidekiq'avant
Uri Agassi
1
Je confond toujours (vraiment toujours) inclure et exiger :)
Benj

Réponses:

207

Vous pouvez faire ce qu'il dit sur le numéro 1077 ou comme indiqué dans ce blog à noobsippets

Les deux suggèrent que nous faisons ce qui suit, et peut être fait sur la console de rails:

Sidekiq.redis { |conn| conn.flushdb }

jonathanccalixto
la source
Cela semble réinitialiser mon authentification sur les applications Rails que j'utilise (ce qui signifie que je dois recopier les cookies dans mon client HTTP). Y a-t-il un moyen d'empêcher cela?
intcreator
1
Bonjour Brandeamon. Utilisez-vous redis pour contrôler la session de votre projet? Étant donné que ces commandes visent à «nettoyer» toutes les données stockées dans redis, cela équivaut à une suppression de base de données ou une suppression de table dans des bases de données relationnelles.
jonathanccalixto
1
Telle devrait être la réponse acceptée compte tenu de ses votes.
M. Habib
Cela fonctionne de manière plus prévisible que redis-cli flushdbsi vous exécutez redis sur un serveur distinct de votre serveur rails. Je me demandais pourquoi redis-cli flushdbcela ne fonctionnait pas jusqu'à ce que je me souvienne que je devais inclure des arguments d'hôte et de port.
maurice
4
Le problème avec cette approche est que si vous partagez le même redis / elasticache entre différents services, cela effacera également toutes les autres données de la base de données redis.
Charles Skariah
80

Effacer les commandes Sidekiq Jobs:

require 'sidekiq/api'

# Clear retry set

Sidekiq::RetrySet.new.clear

# Clear scheduled jobs 

Sidekiq::ScheduledSet.new.clear

# Clear 'Dead' jobs statistics

Sidekiq::DeadSet.new.clear

# Clear 'Processed' and 'Failed' jobs statistics

Sidekiq::Stats.new.reset

# Clear specific queue

stats = Sidekiq::Stats.new
stats.queues
# => {"main_queue"=>25, "my_custom_queue"=>1}

queue = Sidekiq::Queue.new('my_custom_queue')
queue.count
queue.clear
rusllonrails
la source
3
Vous pouvez également effacer toutes les files d'attente avec Sidekiq::Queue.all.map(&:clear)... Utile lorsque vous synchronisez votre base de données locale avec le prod 😅
escanxr
36

À partir du dernier Sidekiq, faites-le exploser:

require 'sidekiq/api'

q = Sidekiq::Queue.new
q.💣

Oui, la commande pour tout effacer est littéralement un emoji de bombe. Fonctionne également pour Sidekiq::RetrySet.

Ou si vous n'êtes pas amusant, vous pouvez utiliser q.clear

Xavier
la source
1
OMG, qu'est-ce que c'est que ça? @Xavier, y a-t-il une méthode nommée .💣, pouvez-vous s'il vous plaît me guider la documentation sur cette méthode (💣).
codemilan
2
@codemilan Voir ce billet de blog: blog.honeybadger.io/…
Modus Tollens
J'ai commencé invalid byte sequence in US-ASCII (ArgumentError)à exécuter q.💣: /
Shankar Thyagarajan
21
redis-cli flushdb

Vous pouvez aussi utiliser redis-cli flushall

Sai Ram Reddy
la source
5
Le problème avec cette approche est que si vous partagez le même redis / elasticache entre différents services, cela effacera également toutes les autres données de la base de données.
Charles Skariah
13

Utilisez Rails Runner sur une seule ligne

rails runner 'Sidekiq.redis { |conn| conn.flushdb }'
crocs
la source
10

Toutes les tâches Sidekiq sont enregistrées dans "Redis".

Vous pouvez nettoyer "Redis" par cette commande

redis-cli flushall
Andriy Kondzolko
la source
8

Vous pouvez l'utiliser pour effacer tous les travaux

require 'sidekiq/api'

Sidekiq::Queue.all.each(&:clear)
Ravi Prakash Singh
la source
1

Si vous souhaitez supprimer des travaux de files d'attente spécifiques, essayez:

queue = Sidekiq::Queue.new("default")
queue.each do |job|
  job.klass # => 'TestWorker'
  job.args # => ['easy']
  job.delete if job.jid == 'abcdef1234567890' || job.klass == 'TestWorker'
end

Pour tout savoir sur sidekiq et les commandes de console importantes - https://medium.com/@shashwat12june/all-you-need-to-know-about-sidekiq-a4b770a71f8f

shashwat srivastava
la source
1
require 'sidekiq/api'

Sidekiq::Queue.all.each(&:clear)
Nicolás Schmidt Gubbins
la source
Cette réponse est un double de stackoverflow.com/a/56488682/3676469
Hirurg103 le
0

J'ai réalisé que cela Sidekiq.redis { |conn| conn.flushdb }supprime toutes les clés de la base de données redis. Il existe un moyen plus sûr d'effacer toutes les files d'attente sidekiq en utilisant redis-cli:

redis-cli keys "*queue:*" | xargs redis-cli del

La même chose peut être obtenue avec l'API Sidekiq (voir la réponse de Ravi Prakash Singh )

Hirurg103
la source