Wyczyść kolejkę sidekiq

93

Mam tego pracownika, który działa wiecznie.

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

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

Problem w tym, że ładuję pracowników podczas uruchamiania, w ten sposób. config/initializers/load_workers.rb

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

Używanie tego do uruchomienia sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml.

Oznacza to, że starzy pracownicy co do zatrzymania, zarówno ci aktualnie pracujący, jak i ci, których harmonogram się zmienia.

Próbowałem uruchomić to podczas uruchamiania (tuż przed załadowaniem nowych prac), ale to nie zadziałało.

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)

Po pięciu wdrożeniach w kolejce zaplanowanej na później znajduje się grupa zduplikowanych pracowników. Czy jest więc sposób, aby wyczyścić wszystko w jednej kolejce i zapobiec zmianie harmonogramu już uruchomionych zadań?

Używam sidekiq 3.0.

Linus Oleander
źródło
Czy chcesz usunąć kolejkę lub zaplanowane zadanie. lub lepiej powiedzieć powielenie zaplanowanej pracy.
Sabyasachi Ghosh
Chcę usunąć wszystkie ślady pracy, zanim załaduję nowego pracownika.
Linus Oleander
ok, mam problem ... oznacza, że ​​chcesz usunąć wszystkie zaplanowane zadania.
Sabyasachi Ghosh
@haSabyasachiGhosh Nie, chcę usunąć wszystko związane z kolejką, a nie tylko zaplanowane zadania. Innymi słowy; nieudane, trwające, oczekujące w kolejce i zaplanowane zadania należy usunąć.
Linus Oleander
Cała pomoc jest tutaj - github.com/mperham/sidekiq/wiki/API
viks

Odpowiedzi:

161

Usuwa wszystkie zadania w kolejce, usuwając kolejkę.

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

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Ranjithkumar Ravi
źródło
Może Sidekiq Pro ci pomoże.
Ranjithkumar Ravi
5
Tutaj, aby wyczyścić liczniki Sidekiq::Stats.new.reset, okazało się, że to pomaga
14
Aby wyczyścić domyślną / pierwszą kolejkę:Sidekiq::Queue.all.first.clear
user456584
1
Sidekiq :: Queue.new („raporty”). Clear i Sidekiq :: Queue.new („alerty”). Clear pomagają wyczyścić bieżącą kolejkę. Ale co z zajętym? Jak wyczyścić zadania „Zajęte”?
Donato,
31
Wyczyść ich wszystkich dziękiSidekiq::Queue.all.each &:clear
Marco Lazzeri,
95

To załatwiło sprawę dla mnie:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
iGEL
źródło
1
Dzięki temu zadziałało jak urok, byłem w sytuacji awaryjnej haha, pomocnik był z waaaaaay zbyt wielu pracowników w kolejce To zadziałało tak, jak się spodziewałem, ponieważ szukałem killpodobnego polecenia
d1jhoni1b
Idealnie, po prostu dodając, że w moim środowisku musiałem require 'sidekiq/api'pracować na konsoli.
bonafernando
19

Działa dla mnie dla większości wersji sidekiq:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

Przejrzyste statystyki (opcjonalnie)

Sidekiq::Stats.new.reset
rusllonrails
źródło
Spowoduje to opróżnienie całej bazy danych, a nie tylko kolejki.
Linus Oleander
czy opróżni całą bazę danych sidekiqa i będzie działał dobrze w konsoli
railsów
-2

Możesz wyczyścić kolejkę, uruchamiając ten kod, chociaż byłyby wbudowane metody.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end
Asad Hameed
źródło
To powinno działać, ponieważ pobraliśmy wszystkie zadania z kolejki, a następnie usunęliśmy je po kolei.
Asad Hameed
Nie, nie ma. Spójrz na istniejące odpowiedzi. Jest to również duplikat istniejącej odpowiedzi.
Linus Oleander
Nie wiem, o czym mówisz. Czy możesz pokazać mi tę samą odpowiedź, którą opublikowałem?
Asad Hameed