Limpiar la cola de sidekiq

93

Tengo este trabajador que corre para siempre.

class Worker
  include Sidekiq::Worker
  sidekiq_options queue: "infinity", retry: true

  def perform(params)
    # ...
    self.class.perform_in(30.seconds, params)
  end
end

El problema es que cargo a los trabajadores al inicio, así. config/initializers/load_workers.rb

Rails.application.config.after_initialize do  
  if ENV["SIDEKIQ"] == "1"
    Worker.perform_async({})
  end
end

Usando esto para iniciar sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml.

Esto significa que los trabajadores viejos deben detenerse, tanto los que están actualmente en ejecución como los que están siendo reprogramados.

Intenté ejecutar esto en el inicio (justo antes de cargar nuevos trabajos), pero no funcionó.

q = []
q += Sidekiq::RetrySet.new.select { |job| job.klass.match(/Worker/) }
q += Sidekiq::Queue.new("infinity").select { |job| job.klass.match(/Worker/) }
q += Sidekiq::ScheduledSet.new.select { |job| job.klass.match(/Worker/) }
q.each(&:delete)

Después de cinco implementaciones, hay un montón de trabajadores duplicados en la cola programados para más adelante. Entonces, ¿hay alguna manera de borrar todo en una cola y evitar que los trabajos que ya están en ejecución se reprogramen?

Estoy usando sidekiq 3.0.

Linus adelfa
fuente
¿Quiere eliminar una cola o un trabajo programado? o mejor dicho trabajo programado duplicado.
Sabyasachi Ghosh
Quiero eliminar todo rastro de un trabajo antes de cargar el nuevo trabajador.
Linus Oleander
ok, tengo su problema ... significa que desea eliminar todos los trabajos programados.
Sabyasachi Ghosh
@haSabyasachiGhosh No, quiero eliminar todo lo relacionado con una cola, no solo los trabajos programados. En otras palabras; Los trabajos fallidos, en curso, en cola y programados deben eliminarse.
Linus Oleander
Toda la ayuda está aquí - github.com/mperham/sidekiq/wiki/API
viks

Respuestas:

161

Elimina todos los trabajos de una cola, eliminando la cola.

require 'sidekiq/api' # for the case of rails console

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Ranjithkumar Ravi
fuente
Might Be Sidekiq Pro te ayudará.
Ranjithkumar Ravi
5
Aquí está para borrar los contadores Sidekiq::Stats.new.reset, descubrí que esto ayuda
14
Para borrar la primera cola predeterminada:Sidekiq::Queue.all.first.clear
user456584
1
Sidekiq :: Queue.new ("informes"). Clear y Sidekiq :: Queue.new ("alertas"). Clear ayudan a borrar la cola actual. Pero ¿qué pasa con Busy? ¿Cómo borro los trabajos "Ocupados"?
Donato
31
Elimínelos todos conSidekiq::Queue.all.each &:clear
Marco Lazzeri
95

Esto funcionó para mí:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
iGEL
fuente
1
Gracias, esto funcionó como un encanto, estaba en una emergencia jaja, el compañero estaba con waaaaaay demasiados trabajadores en la cola, esto funcionó como esperaba ya que estaba buscando un killcomando similar
d1jhoni1b
Perfecto, solo agregué que en mi entorno tenía que estar require 'sidekiq/api'en la consola para trabajar.
bonafernando
19

Me funciona para la mayoría de las versiones de sidekiq:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

Estadísticas claras (opcional)

Sidekiq::Stats.new.reset
rusllonrails
fuente
Esto vacía toda la base de datos, no solo la cola.
Linus Oleander
if vaciará toda la base de datos de sidekiq y funcionará bien en la consola de rieles
vidur punj
-2

Puede borrar su cola ejecutando este código, aunque habría métodos integrados.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end
Asad Hameed
fuente
Bueno, esto debería funcionar ya que obtuvimos todos los trabajos de la cola y luego los eliminamos uno por uno.
Asad Hameed
No, no lo hace. Eche un vistazo a las respuestas existentes. También es un duplicado de la respuesta existente.
Linus Oleander
No sé de qué estás hablando. ¿Me pueden mostrar la misma respuesta que publiqué?
Asad Hameed