Очистити чергу Sidekiq


93

У мене цей працівник, який працює вічно.

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

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

Проблема в тому, що я завантажую робітників під час запуску, як це. config/initializers/load_workers.rb

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

Використовуючи це для запуску sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml.

Це означає, що старі працівники повинні зупинитися, як ті, хто працює в даний час, так і ті, хто перепланований.

Я спробував запустити це під час запуску (безпосередньо перед завантаженням нових робіт), але це не спрацювало.

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)

Після 5-ідних розгортань у черзі, запланованій на пізніше, є купа дублікатів працівників. Отже, чи є спосіб очистити все в одній черзі та запобігти переплануванню вже запущених завдань?

Я використовую sidekiq 3.0.


Видалити чергу або заплановане завдання. або краще сказати дублікат запланованої роботи.
Sabyasachi Ghosh

Я хочу видалити кожен слід роботи, перш ніж завантажувати нового працівника.
Лінус Олеандр,

добре, зрозуміла ваша проблема .. означає, що ви хочете видалити всі заплановані завдання.
Sabyasachi Ghosh

@haSabyasachiGhosh Ні, я хочу видалити все, що стосується черги, а не лише запланованих завдань. Іншими словами; невдалі, поточні, в черзі та заплановані завдання слід видалити.
Лінус Олеандр,

Вся допомога тут - github.com/mperham/sidekiq/wiki/API
viks

Відповіді:


161

Видаляє всі завдання в черзі, видаляючи чергу.

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

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear

Можливо, Sidekiq Pro допоможе вам.
Ranjithkumar Ravi

5
Ось, щоб очистити лічильники, Sidekiq::Stats.new.resetя дізнався, що це допомагає

14
Щоб очистити типову / першу чергу:Sidekiq::Queue.all.first.clear
user456584

1
Sidekiq :: Queue.new ("звіти"). Clear та Sidekiq :: Queue.new ("попередження"). Clear допомагає очистити поточну чергу. Але як щодо зайнятого? Як очистити робочі місця, що зайняті?
Донато

31
Очистіть їх усімаSidekiq::Queue.all.each &:clear
Marco Lazzeri

95

Це зробило для мене фокус:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear

1
Завдяки цьому це спрацювало як шарм, я потрапив у надзвичайну ситуацію ха-ха, помічник був із вааааааай занадто багато працівників у черзі, це спрацювало, як я і очікував, оскільки я шукав killподібну команду
d1jhoni1b

Ідеально, просто додавши, що в моєму середовищі мені довелося працювати require 'sidekiq/api'на консолі.
bonafernando

19

Мені підходить для більшості версій sidekiq:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

Очистити статистику (Необов’язково)

Sidekiq::Stats.new.reset

Це очищає всю базу даних, а не лише чергу.
Лінус Олеандр,

якщо змиє всю базу даних sidekiq і буде нормально працювати в консолі rails
vidur punj

-2

Ви можете очистити свою чергу, запустивши цей код, хоча існують вбудовані методи.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end

Ну, це повинно спрацювати, оскільки ми дістали всі завдання з черги, а потім видалили їх по одному.
Асад Хамід

Ні, це не так. Погляньте на існуючі відповіді. Це також дублікат наявної відповіді.
Лінус Олеандр,

Не знаю, про що ти. Чи можете ви показати мені ту саму відповідь, яку я опублікував?
Asad Hameed,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.