Очистити чергу 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.