Existe-t-il des commandes de console pour regarder ce qui se trouve dans la file d'attente et pour vider la file d'attente dans Sidekiq?

97

J'ai l'habitude d'utiliser la méthode delay_jobs pour accéder à la console pour voir ce qui se trouve dans la file d'attente et la facilité de vider la file d'attente en cas de besoin. Existe-t-il des commandes similaires dans Sidekiq pour cela? Merci!

persévérance
la source
1
comme mentionné par d'autres, la réponse sélectionnée ci-dessous est obsolète.
emf

Réponses:

90

Je n'ai jamais utilisé Sidekiq, il est donc possible qu'il existe des méthodes uniquement pour afficher les tâches en file d'attente, mais elles ne seraient en réalité que des enveloppes autour des commandes Redis, car c'est essentiellement tout ce que Sidekiq (et Resque) est:

# See workers
Sidekiq::Client.registered_workers

# See queues
Sidekiq::Client.registered_queues

# See all jobs for one queue
Sidekiq.redis { |r| r.lrange "queue:app_queue", 0, -1 }

# See all jobs in all queues
Sidekiq::Client.registered_queues.each do |q|
  Sidekiq.redis { |r| r.lrange "queue:#{q}", 0, -1 }
end

# Remove a queue and all of its jobs
Sidekiq.redis do |r| 
  r.srem "queues", "app_queue"
  r.del  "queue:app_queue"
end

Malheureusement, supprimer une tâche spécifique est un peu plus difficile car vous devrez copier sa valeur exacte:

# Remove a specific job from a queue
Sidekiq.redis { |r| r.lrem "queue:app_queue", -1, "the payload string stored in Redis" }

Vous pouvez faire tout cela encore plus facilement via redis-cli:

$ redis-cli
> select 0 # (or whichever namespace Sidekiq is using)
> keys * # (just to get an idea of what you're working with)
> smembers queues
> lrange queues:app_queue 0 -1
> lrem queues:app_queue -1 "payload"
maçon
la source
Avez-vous vu un bon moyen d'importer / migrer les tâches planifiées de resque au format sidekiq? Définir l'espace de noms de sidekiq sur «resque» ne semble pas reprendre les tâches planifiées d'après ce que je peux dire. Merci!
Brian Armstrong
31
Certaines des solutions proposées ici sont obsolètes.
Peter Wagenet
@BrianArmstrong Sidekiq.redis {| r | r.zrange ("schedule", 0, -1, {withscores: true})} a fonctionné pour moi en référençant stackoverflow.com/questions/16009639/...
Paul
2
Comme Wagenet l'a souligné ci-dessus, ces exemples sont dépassés; comme mkirk l'a souligné ci-dessous, les derniers documents avec exemples sont sur le wiki: github.com/mperham/sidekiq/wiki/API
odigity
1
Sidekiq::Client.registered_queues a été remplacé par Sidekiq::Queue.allet Sidekiq::Client.registered_workerspar Sidekiq::Workers.new, voir: github.com/mperham/sidekiq/blob/…
Martin Svoboda
136

Il existe une API ergonomique pour visualiser et gérer les files d'attente .

Ce n'est pas obligatoire par défaut.

require 'sidekiq/api'

Voici l'extrait:

# get a handle to the default queue
default_queue = Sidekiq::Queue.new 

# get a handle to the mailer queue
mailer_queue = Sidekiq::Queue.new("mailer") 

# How many jobs are in the default queue?
default_queue.size # => 1001

# How many jobs are in the mailer queue?
mailer_queue.size # => 50

#Deletes all Jobs in a Queue, by removing the queue.    
default_queue.clear

Vous pouvez également obtenir des statistiques récapitulatives.

stats = Sidekiq::Stats.new

# Get the number of jobs that have been processed.
stats.processed # => 100

# Get the number of jobs that have failed.    
stats.failed # => 3

# Get the queues with name and number enqueued.
stats.queues # => { "default" => 1001, "email" => 50 }

#Gets the number of jobs enqueued in all queues (does NOT include retries and scheduled jobs).
stats.enqueued # => 1051 
mkirk
la source
9
C'est l'approche qui fonctionne actuellement (août 2016). La réponse acceptée est obsolète depuis ~ 2013.
Jan Klimo
10

s'il y a un travail planifié. Vous pouvez supprimer tous les travaux à l'aide de la commande suivante:

Sidekiq::ScheduledSet.new.clear

s'il existe des files d'attente pour lesquelles vous souhaitez supprimer tous les travaux, vous pouvez utiliser la commande suivante:

  Sidekiq::Queue.new.clear

Retries Jobs peut également être supprimé à l'aide de la commande suivante:

Sidekiq::RetrySet.new.clear

Il y a plus d'informations ici sur le lien suivant, vous pouvez commander: https://github.com/mperham/sidekiq/wiki/API

Rubyrider
la source
7

Il existe une API pour accéder aux informations en temps réel sur les travailleurs, les files d'attente et les travaux.
Visitez ici https://github.com/mperham/sidekiq/wiki/API

Ranjithkumar Ravi
la source
2

Une solution de contournement consiste à utiliser le module de test (nécessite 'sidekiq / testing') et à vider le worker (MyWorker.drain).

chikamichi
la source
2

Il y avait des «ouvriers» pendus dans la file d'attente par défaut et j'ai pu les voir via l'interface Web. Mais ils n'étaient pas disponibles depuis la console si j'utilisais Sidekiq :: Queue.new.size

irb(main):002:0> Sidekiq::Queue.new.size
2014-03-04T14:37:43Z 17256 TID-oujb9c974 INFO: Sidekiq client with redis options {:namespace=>"sidekiq_staging"}
=> 0

En utilisant redis-cli, j'ai pu les trouver

redis 127.0.0.1:6379> keys *
    1) "sidekiq_staging:worker:ip-xxx-xxx-xxx-xxx:7635c39a29d7b255b564970bea51c026-69853672483440:default"
    2) "sidekiq_staging:worker:ip-xxx-xxx-xxx-xxx:0cf585f5e93e1850eee1ae4613a08e45-70328697677500:default:started"
    3) "sidekiq_staging:worker:ip-xxx-xxx-xxx-xxx:7635c39a29d7b255b564970bea51c026-69853672320140:default:started"
    ...

La solution était:

irb(main):003:0>  Sidekiq.redis { |r| r.del "workers", 0, -1 }
=> 1

Aussi dans le Sidekiq v3 il y a une commande

Sidekiq::Workers.new.prune

Mais pour une raison quelconque, cela n'a pas fonctionné pour moi ce jour-là

Ivan Linko
la source
2

Et si vous voulez effacer la file d'attente de relance sidekiq, c'est ceci: Sidekiq::RetrySet.new.clear

courtsimas
la source
2
$ redis-cli
> select 0 # (or whichever namespace Sidekiq is using)
> keys * # (just to get an idea of what you're working with)
> smembers queues
> lrange queue:queue_name 0 -1 # (queue_name must be your relevant queue)
> lrem queue:queue_name -1 "payload"
Prashant Vithani
la source
9
Ne jamais exécuter keys *en production à moins que vous n'utilisiez ce redis uniquement pour sidekiq. Surtout, ne l'exécutez pas si vous avez un grand ensemble de données (cache, etc.). Redis est mono-thread et keys *bloque - cela peut entraîner un temps d'arrêt de plusieurs minutes sur de grands ensembles de données (plusieurs Gbs).
timurb
1

Rake tâche pour effacer toutes les files sidekiq:

namespace :sidekiq do
  desc 'Clear sidekiq queue'
  task clear: :environment do
    require 'sidekiq/api'
    Sidekiq::Queue.all.each(&:clear)
  end
end

Usage:

rake sidekiq:clear
Côté obscur
la source