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.


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

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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.