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.


¿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

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

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.