web-dev-qa-db-fra.com

Existe-t-il des commandes de la console pour examiner les éléments de la file d'attente et les vider dans Sidekiq?

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!

91
perseverance

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"
86
bricker

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 
131
mkirk

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

9
Rubyrider

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

7
Ranjithkumar Ravi

Et si vous souhaitez effacer la file d'attente de nouvelles tentatives de sidekiq, voici ceci: Sidekiq::RetrySet.new.clear

2
courtsimas
$ 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"
2
Prashant Vithani

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

2
chikamichi

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à

1
Ivan Linko

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
1
Darkside