2013-06-13 1 views
5

У меня есть работники «Резек», которые обычно не должны занимать больше 1-5 минут, но часто эти рабочие «застревают» и простаивают, забивая рабочих и ничего не делая.Регулярно чистить устаревшие работники Resque на Heroku?

Так что я бы хотел регулярно проверять работников, которые работали дольше X и чистили их. Но мне нужно сделать это автоматически, поэтому мне не нужно лично входить и вручную очищать их (Resque.workers.each {|w| w.unregister_worker}) каждые несколько часов.

Это должно работать на Heroku.

+0

Является ли время, когда работник начал надежный индикатор, что он застрял? Я предполагаю, что 1-5 минут - это продолжительность работы. Но если работа будет продолжаться, рабочий может бежать вечно и не «застревать». Да? Я спрашиваю, потому что у меня такая же проблема, и я хочу надежный способ снять блокировку. –

ответ

5

Поместите это в задачу грабли:

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

Используйте Heroku планировщик, вы можете установить его на минимум 10 минут, если что-люкс.

+0

Это, кажется, только Resque 2, люди используют это в производстве сейчас? Мое впечатление от README заключалось в том, что вы еще не должны его использовать. – opsb

+0

Похоже, что worker.started сообщит вам, когда работник был первоначально зарегистрирован - НЕ, как долго он работал над текущей работой. Так что это не правильный тест, чтобы сказать, застрял ли рабочий или нет. См. [Этот ответ] (http://stackoverflow.com/a/21560463/629636) для способа извлечения времени начала текущего задания. –

0

Для 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 

из командной строки, rake clear:stale_workers

На Heroku, установить набор планировщик для запуска этой задачи Rake.

0

Это работало для меня, чтобы удалить конкретных работников, выполняющих устаревшие задания. Вы можете добавить его к задаче грабли.

Resque::Worker.working.each{|w| w.done_working }