Je suis habitué à utiliser la méthode delay_jobs d'aller dans la console pour voir ce qu'il y a 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!
Je n'ai jamais utilisé Sidekiq, il est donc possible qu'il existe des méthodes permettant uniquement de visualiser les travaux en file d'attente, mais il ne s'agirait que de wrappers autour des commandes Redis, car c'est en gros tout ce que Sidekiq (et Resque) contient:
# 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 un travail spécifique est un peu plus difficile car vous devez 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"
Il existe une interface ergonomique API permettant d'afficher et de gérer les files d'attente .
Ce n'est pas requis 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 sommaires.
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
s'il y a un travail planifié. Vous pouvez supprimer tous les travaux à l'aide de la commande suivante:
Sidekiq::ScheduledSet.new.clear
si vous souhaitez supprimer tous les travaux dans une file d'attente, vous pouvez utiliser la commande suivante:
Sidekiq::Queue.new.clear
Les tentatives de relance peuvent également être supprimées à l'aide de la commande suivante:
Sidekiq::RetrySet.new.clear
Il y a plus d'informations ici au lien suivant, vous pouvez passer à la caisse: https://github.com/mperham/sidekiq/wiki/API
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
Et si vous souhaitez effacer la file d'attente de nouvelles tentatives de sidekiq, voici ceci: Sidekiq::RetrySet.new.clear
$ 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"
Une solution de contournement consiste à utiliser le module de test (nécessite 'sidekiq/testing') et à drainer le travailleur (MyWorker.drain).
Il y avait des "travailleurs" 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
À l'aide de 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 Sidekiq v3, il y a une commande
Sidekiq::Workers.new.Prune
Mais pour une raison quelconque, cela ne fonctionna pas pour moi ce jour-là
Tâche de ratissage pour éliminer toutes les files d'attente de 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