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!
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!
Antworten:
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"
Sidekiq::Client.registered_queues
wurde durch Sidekiq::Queue.all
und Sidekiq::Client.registered_workers
mit ersetzt Sidekiq::Workers.new
, siehe: github.com/mperham/sidekiq/blob/…
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
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
Es gibt eine API für den Zugriff auf Echtzeitinformationen zu Arbeitnehmern, Warteschlangen und Jobs.
Besuchen Sie hier https://github.com/mperham/sidekiq/wiki/API
Eine Problemumgehung besteht darin, das Testmodul zu verwenden ('sidekiq / testing' erforderlich) und den Worker zu entleeren (MyWorker.drain).
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
Und wenn Sie die Sidekiq-Wiederholungswarteschlange löschen möchten, ist dies: 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"
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.
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