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.