2013-06-13 12 views
5

Mam pracowników Resque, które zazwyczaj nie powinny trwać dłużej niż około 1-5 minut, ale często ci pracownicy zostaną "zablokowani" i idą bezczynnie, zapychając pracowników i nie robiąc nic.Regularnie usuwać nieświeżych pracowników Resque na Heroku?

Chciałbym więc regularnie sprawdzać pracowników, którzy pracowali dłużej niż X i oczyścić je. Ale muszę to zrobić automatycznie, więc nie muszę osobiście wchodzić i ręcznie je kasować (Resque.workers.each {|w| w.unregister_worker}) co kilka godzin.

To musi działać na Heroku.

+0

Czy ilość czasu od momentu, w którym pracownik rozpoczął rzetelny wskaźnik, że się zawiesił? Zakładam, że 1-5 minut to czas pracy. Ale jeśli prace nadejdą, pracownik może biec na zawsze, a nie "utknąć". Tak? Pytam, ponieważ mam ten sam problem i chcę niezawodnego sposobu na usunięcie blokady. –

Odpowiedz

5

Włóż to do zadania natarcia:

allocated_time = 60 * 60 # 1 hour 
Resque::WorkerRegistry.working.each do |worker| 
    if (worker.started <=> Time.now - allocated_time) < 1 
    worker.unregister 
    end 
end 

Zastosowanie Heroku scheduler, można ustawić ją na minimum 10 minut, jeśli, że apartamenty.

+0

Wygląda na to, że tylko w wersji Resque 2, ludzie używają tego w produkcji? Moje wrażenie z README było takie, że nie powinieneś go jeszcze używać. – opsb

+0

Wygląda na to, że worker.started powie Ci, kiedy pracownik był pierwotnie zarejestrowany - NIE jak długo pracował nad bieżącym zadaniem. Więc nie jest to właściwy test, aby stwierdzić, czy pracownik utknął, czy nie. Zobacz [tę odpowiedź] (http://stackoverflow.com/a/21560463/629636) dla metody pobierania czasu rozpoczęcia bieżącego zadania. –

0

Dla Resque v1,

# lib/tasks/clear_stale_workers.rake 
namespace :clear do 
    desc 'Clearing stuck workers ...' 
    task :stale_workers => :environment do 
    Resque.workers.each do |w| 
     w.unregister_worker unless w.started > 1.hour.ago 
    end 
    end 
end 

Z linii poleceń, rake clear:stale_workers

Na Heroku ustaw zestawie harmonogramu uruchamiania tego zadania Rake.

0

To działało dla mnie, aby usunąć konkretnych pracowników, którzy wykonują nieaktualne prace. Możesz dodać go do zadania rake.

Resque::Worker.working.each{|w| w.done_working } 
Powiązane problemy