Gibt es Konsolenbefehle, um zu überprüfen, was sich in der Warteschlange befindet, und um die Warteschlange in Sidekiq zu löschen?

97

Ich bin es gewohnt, mit der Methode delay_jobs in die Konsole zu gehen, um zu sehen, was sich in der Warteschlange befindet, und die Warteschlange bei Bedarf einfach zu löschen. Gibt es dafür ähnliche Befehle in Sidekiq? Vielen Dank!

Ausdauer
quelle
1
Wie von anderen erwähnt, ist die unten stehende ausgewählte Antwort veraltet.
EMF

Antworten:

90

Ich habe Sidekiq noch nie verwendet, daher gibt es möglicherweise Methoden zum Anzeigen der Jobs in der Warteschlange, aber es handelt sich eigentlich nur um Wrapper um Redis-Befehle, da dies im Grunde alles ist, was Sidekiq (und Resque) ist:

# 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

Leider ist das Entfernen eines bestimmten Jobs etwas schwieriger, da Sie den genauen Wert kopieren müssten:

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

All dies können Sie noch einfacher tun über 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"
Maurer
quelle
Haben Sie eine gute Möglichkeit gesehen, geplante Resque-Jobs in das Sidekiq-Format zu importieren / zu migrieren? Wenn Sie den Namespace von sidekiq auf "resque" setzen, werden geplante Jobs anscheinend nicht von dem übernommen, was ich sagen kann. Vielen Dank!
Brian Armstrong
31
Einige der hier angebotenen Lösungen sind veraltet.
Peter Wagenet
@BrianArmstrong Sidekiq.redis {| r | r.zrange ("Zeitplan", 0, -1, {withscores: true})} arbeitete für mich unter Bezugnahme auf stackoverflow.com/questions/16009639/…
Paul
2
Wie Wagenet oben ausgeführt hat, sind diese Beispiele veraltet. Wie Mkirk weiter unten ausführte, befinden sich die neuesten Dokumente mit Beispielen im Wiki: github.com/mperham/sidekiq/wiki/API
Odigity
1
Sidekiq::Client.registered_queues wurde durch Sidekiq::Queue.allund Sidekiq::Client.registered_workersmit ersetzt Sidekiq::Workers.new, siehe: github.com/mperham/sidekiq/blob/…
Martin Svoboda
136

Es gibt eine ergonomische API zum Anzeigen und Verwalten von Warteschlangen .

Es ist standardmäßig nicht erforderlich.

require 'sidekiq/api'

Hier ist der Auszug:

# 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

Sie können auch einige zusammenfassende Statistiken erhalten.

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
quelle
9
Dies ist der Ansatz, der derzeit funktioniert (August 2016). Die akzeptierte Antwort ist ab ~ 2013 veraltet.
Jan Klimo
10

wenn es einen geplanten Job gibt. Sie können alle Jobs mit dem folgenden Befehl löschen:

Sidekiq::ScheduledSet.new.clear

Wenn Warteschlangen vorhanden sind, in denen Sie alle Jobs löschen möchten, können Sie den folgenden Befehl verwenden:

  Sidekiq::Queue.new.clear

Wiederholungsjobs können auch mit dem folgenden Befehl entfernt werden:

Sidekiq::RetrySet.new.clear

Weitere Informationen finden Sie hier unter folgendem Link: https://github.com/mperham/sidekiq/wiki/API

Rubyrider
quelle
2

Eine Problemumgehung besteht darin, das Testmodul zu verwenden ('sidekiq / testing' erforderlich) und den Worker zu entleeren (MyWorker.drain).

Chikamichi
quelle
2

In der Standardwarteschlange waren "Arbeiter" gehängt, und ich konnte sie über die Weboberfläche sehen. Sie waren jedoch nicht über die Konsole verfügbar, wenn ich Sidekiq :: Queue.new.size verwendet habe

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

Mit redis-cli konnte ich sie finden

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"
    ...

Die Lösung war:

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

Auch in Sidekiq v3 gibt es einen Befehl

Sidekiq::Workers.new.prune

Aber aus irgendeinem Grund hat es an diesem Tag bei mir nicht funktioniert

Ivan Linko
quelle
2

Und wenn Sie die Sidekiq-Wiederholungswarteschlange löschen möchten, ist dies: Sidekiq::RetrySet.new.clear

Courtsimas
quelle
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
quelle
9
Laufen Sie niemals keys *in der Produktion, es sei denn, Sie verwenden diese Redis nur für Sidekiq. Führen Sie es insbesondere nicht aus, wenn Sie über große Datenmengen (Cache usw.) verfügen. Redis ist Single-Threaded und keys *blockiert - dies kann bei großen Datenmengen (mehrere Gbs) zu Ausfallzeiten von mehreren Minuten führen.
Timurb
1

Rechenaufgabe zum Löschen aller Sidekiq-Warteschlangen:

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

Verwendung:

rake sidekiq:clear
Dunkle Seite
quelle