Ci sono comandi della console per guardare cosa c'è nella coda e per cancellare la coda in Sidekiq?


97

Sono abituato a utilizzare il metodo delayed_jobs per accedere alla console per vedere cosa c'è nella coda e la facilità di svuotare la coda quando necessario. Esistono comandi simili in Sidekiq per questo? Grazie!


1
come menzionato da altri, la risposta selezionata di seguito è deprecata.
emf

Risposte:


90

Non ho mai usato Sidekiq, quindi è possibile che esistano metodi solo per visualizzare i lavori in coda, ma in realtà sarebbero solo wrapper attorno ai comandi Redis, poiché questo è fondamentalmente tutto Sidekiq (e Resque) è:

# 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

Sfortunatamente, rimuovere un lavoro specifico è un po 'più difficile in quanto dovresti copiare il suo valore esatto:

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

Potresti fare tutto questo ancora più facilmente tramite 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"

Hai visto un buon modo per importare / migrare i lavori pianificati di riseguimento nel formato di sidekiq? L'impostazione dello spazio dei nomi di sidekiq su "resque" non sembra raccogliere i lavori pianificati da quello che posso dire. Grazie!
Brian Armstrong

31
Alcune delle soluzioni fornite qui sono deprecate.
Peter Wagenet

@BrianArmstrong Sidekiq.redis {| r | r.zrange ("schedule", 0, -1, {withscores: true})} ha funzionato per me facendo riferimento a stackoverflow.com/questions/16009639/…
Paul

2
Come Wagenet ha sottolineato sopra, questi esempi sono obsoleti; come mkirk ha sottolineato di seguito, gli ultimi documenti con esempi sono sul wiki: github.com/mperham/sidekiq/wiki/API
odigity

1
Sidekiq::Client.registered_queues è stato sostituito con Sidekiq::Queue.alle Sidekiq::Client.registered_workerscon Sidekiq::Workers.new, vedere: github.com/mperham/sidekiq/blob/…
Martin Svoboda

136

C'è un'API ergonomica per la visualizzazione e la gestione delle code .

Non è richiesto per impostazione predefinita.

require 'sidekiq/api'

Ecco l'estratto:

# 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

Puoi anche ottenere alcune statistiche di riepilogo.

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
Questo è l'approccio che funziona in questo momento (agosto 2016). La risposta accettata è obsoleta a partire dal ~ 2013.
Jan Klimo,

10

se è presente un lavoro pianificato. È possibile eliminare tutti i lavori utilizzando il seguente comando:

Sidekiq::ScheduledSet.new.clear

se ci sono delle code che vuoi eliminare tutti i lavori puoi usare il seguente comando:

  Sidekiq::Queue.new.clear

Riprova I lavori possono essere rimossi anche con il seguente comando:

Sidekiq::RetrySet.new.clear

Ci sono maggiori informazioni qui al seguente link, puoi effettuare il checkout: https://github.com/mperham/sidekiq/wiki/API



2

Una soluzione alternativa consiste nell'usare il modulo testing (richiede 'sidekiq / testing') e svuotare il worker (MyWorker.drain).


2

C'erano "lavoratori" impiccati nella coda predefinita e sono stato in grado di vederli attraverso l'interfaccia web. Ma non erano disponibili dalla console se usavo 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

Usando redis-cli sono riuscito a trovarli

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 soluzione era:

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

Anche in Sidekiq v3 c'è un comando

Sidekiq::Workers.new.prune

Ma per qualche motivo non ha funzionato per me quel giorno


2

E se vuoi cancellare la coda dei tentativi di sidekiq, è questo: 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
Non eseguire mai la keys *produzione a meno che non utilizzi quel redis solo per sidekiq. Soprattutto non eseguirlo se si dispone di un set di dati di grandi dimensioni (cache, ecc.). Redis è a thread singolo e si keys *blocca: ciò può comportare diversi minuti di inattività su set di dati di grandi dimensioni (diversi GB).
timurb

1

Rake task per cancellare tutte le code sidekiq:

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

Utilizzo:

rake sidekiq:clear
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.