Czy są polecenia konsoli, aby sprawdzić, co jest w kolejce i wyczyścić kolejkę w Sidekiq?


97

Jestem przyzwyczajony do korzystania z metody delayed_jobs wchodzenia do konsoli, aby zobaczyć, co jest w kolejce, i łatwości czyszczenia kolejki w razie potrzeby. Czy w Sidekiq są podobne polecenia do tego? Dzięki!


1
jak wspominali inni, wybrana odpowiedź poniżej jest przestarzała.
emf

Odpowiedzi:


90

Nigdy nie korzystałem z Sidekiqa, więc możliwe, że istnieją metody tylko do przeglądania zadań w kolejce, ale tak naprawdę byłyby one tylko opakowaniami wokół poleceń Redis, ponieważ to w zasadzie wszystko Sidekiq (i Resque) to:

# 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

Niestety, usunięcie konkretnego zlecenia jest trochę trudniejsze, ponieważ musiałbyś skopiować jego dokładną wartość:

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

Możesz to wszystko zrobić jeszcze łatwiej poprzez 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"

Czy widziałeś dobry sposób na importowanie / migrowanie zaplanowanych zadań do formatu sidekiq? Ustawienie przestrzeni nazw sidekiq na „resque” nie wydaje się odbierać zaplanowanych zadań z tego, co wiem. Dzięki!
Brian Armstrong

31
Niektóre z przedstawionych tutaj rozwiązań są przestarzałe.
Peter Wagenet

@BrianArmstrong Sidekiq.redis {| r | r.zrange ("schedule", 0, -1, {withscores: true})} pracował dla mnie, odwołując się do stackoverflow.com/questions/16009639/ ...
Paul

2
Jak wskazał Wagenet powyżej, przykłady te są nieaktualne; jak wskazał mkirk poniżej, najnowsze dokumenty z przykładami znajdują się na wiki: github.com/mperham/sidekiq/wiki/API
odigity

1
Sidekiq::Client.registered_queues został zastąpiony Sidekiq::Queue.alli Sidekiq::Client.registered_workersze Sidekiq::Workers.newpatrz: github.com/mperham/sidekiq/blob/...
Martin Svoboda

136

Istnieje ergonomiczne API do przeglądania i zarządzania kolejkami .

Nie jest to wymagane domyślnie.

require 'sidekiq/api'

Oto fragment:

# 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

Możesz również uzyskać podsumowanie statystyk.

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 

9
To podejście działa obecnie (sierpień 2016 r.). Przyjęta odpowiedź jest nieaktualna od ~ 2013.
Jan Klimo

10

czy jest jakieś zaplanowane zadanie. Możesz usunąć wszystkie zadania za pomocą następującego polecenia:

Sidekiq::ScheduledSet.new.clear

jeśli są jakieś kolejki, które chcesz usunąć wszystkie zadania, możesz użyć następującego polecenia:

  Sidekiq::Queue.new.clear

Zadania ponownych prób można również usunąć za pomocą następującego polecenia:

Sidekiq::RetrySet.new.clear

Więcej informacji znajduje się tutaj pod poniższym linkiem, możesz sprawdzić: https://github.com/mperham/sidekiq/wiki/API



2

Obejściem problemu jest użycie modułu testującego (wymagaj 'sidekiq / testing') i opróżnienie pracownika (MyWorker.drain).


2

W domyślnej kolejce byli powieszeni „pracownicy” i mogłem ich zobaczyć przez interfejs WWW. Ale nie były dostępne z konsoli, gdybym używał 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

Dzięki redis-cli udało mi się je znaleźć

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

Rozwiązaniem było:

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

Również w Sidekiq v3 jest polecenie

Sidekiq::Workers.new.prune

Ale z jakiegoś powodu tego dnia mi to nie wyszło


2

A jeśli chcesz wyczyścić kolejkę ponownych prób sidekiqa, to jest to: Sidekiq::RetrySet.new.clear


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"

9
Nigdy nie uruchamiaj keys *na produkcji, chyba że używasz tego redis tylko do sidekiqa. Szczególnie nie uruchamiaj go, jeśli masz duży zestaw danych (pamięć podręczna itp.). Usługa Redis jest jednowątkowa i keys *blokuje - może to skutkować kilkuminutowym przestojem w przypadku dużych zestawów danych (kilka GB).
timurb

1

Zadanie rake, aby usunąć wszystkie kolejki sidekiq:

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

Stosowanie:

rake sidekiq:clear
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.