¿Hay comandos de consola para ver qué hay en la cola y borrar la cola en Sidekiq?

97

Estoy acostumbrado a usar el método delayed_jobs para ingresar a la consola para ver qué hay en la cola y la facilidad de borrar la cola cuando sea necesario. ¿Hay comandos similares en Sidekiq para esto? ¡Gracias!

perseverancia
fuente
1
como lo mencionaron otros, la respuesta seleccionada a continuación está obsoleta.
fem

Respuestas:

90

Nunca he usado Sidekiq, por lo que es posible que haya métodos solo para ver los trabajos en cola, pero en realidad serían simplemente envoltorios de los comandos de Redis, ya que eso es básicamente todo lo que Sidekiq (y Resque) es:

# 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

Desafortunadamente, eliminar un trabajo específico es un poco más difícil ya que tendría que copiar su valor exacto:

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

Puede hacer todo esto aún más fácilmente a través de 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"
albañil
fuente
¿Ha visto una buena manera de importar / migrar trabajos programados resque al formato de sidekiq? Establecer el espacio de nombres de sidekiq en 'resque' no parece recoger los trabajos programados por lo que puedo decir. ¡Gracias!
Brian Armstrong
31
Algunas de las soluciones proporcionadas aquí están obsoletas.
Peter Wagenet
@BrianArmstrong Sidekiq.redis {| r | r.zrange ("schedule", 0, -1, {withscores: true})} funcionó para mí haciendo referencia a stackoverflow.com/questions/16009639/…
Paul
2
Como señaló Wagenet anteriormente, estos ejemplos están desactualizados; como mkirk señaló a continuación, los últimos documentos con ejemplos están en la wiki: github.com/mperham/sidekiq/wiki/API
odigity
1
Sidekiq::Client.registered_queues ha sido reemplazado con Sidekiq::Queue.ally Sidekiq::Client.registered_workerscon Sidekiq::Workers.new, ver: github.com/mperham/sidekiq/blob/…
Martin Svoboda
136

Hay una API ergonómica para ver y administrar colas. .

No es necesario por defecto.

require 'sidekiq/api'

Aquí está el extracto:

# 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

También puede obtener algunas estadísticas resumidas.

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
fuente
9
Este es el enfoque que funciona en este momento (agosto de 2016). La respuesta aceptada está desactualizada a partir de ~ 2013.
Jan Klimo
10

si hay algún trabajo programado. Puede eliminar todos los trabajos usando el siguiente comando:

Sidekiq::ScheduledSet.new.clear

Si hay colas, desea eliminar todos los trabajos, puede usar el siguiente comando:

  Sidekiq::Queue.new.clear

Reintentos Los trabajos también se pueden eliminar con el siguiente comando:

Sidekiq::RetrySet.new.clear

Hay más información aquí en el siguiente enlace, puede pagar: https://github.com/mperham/sidekiq/wiki/API

Rubyrider
fuente
2

Una solución alternativa es usar el módulo de prueba (requiere 'sidekiq / testing') y drenar al trabajador (MyWorker.drain).

chikamichi
fuente
2

Había 'trabajadores' colgados en la cola predeterminada y pude verlos a través de la interfaz web. Pero no estaban disponibles desde la consola si usaba 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 pude encontrarlos

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 solucion fue:

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

También en Sidekiq v3 hay un comando

Sidekiq::Workers.new.prune

Pero por alguna razón no funcionó para mí ese día

Ivan Linko
fuente
2

Y si desea borrar la cola de reintentos de sidekiq, es esto: Sidekiq::RetrySet.new.clear

courtimas
fuente
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
fuente
9
Nunca keys *ejecutes en producción a menos que uses ese redis solo para sidekiq. Especialmente, no lo ejecute si tiene un gran conjunto de datos (caché, etc.). Redis es de un solo subproceso y se keys *bloquea; esto puede resultar en varios minutos de tiempo de inactividad en grandes conjuntos de datos (varios Gbs).
timurb
1

Tarea de rastrillo para borrar todas las colas de sidekiq:

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

Uso:

rake sidekiq:clear
Lado oscuro
fuente