定期清理Heroku上过期的Resque工作者?

5
我有一些Resque工作进程,通常不应超过1-5分钟运行,但是经常出现这些工作进程会"卡住"并处于空闲状态,导致阻塞其他工作进程并且做不了任何事情。
因此,我希望定期检查运行时间超过X时间的工作进程并将其清理。但是我需要自动完成这个过程,这样我就不必亲自去手动清理它们(Resque.workers.each {|w| w.unregister_worker})每隔几个小时。
这个功能需要在Heroku上正常运行。

工作人员启动以来的时间是否是它卡住的可靠指标?我假设1-5分钟是工作持续时间。但如果工作不断涌现,工作人员可能会永远运行而不被“卡住”。是吗?我之所以问这个问题,是因为我遇到了同样的问题,我想找到一种可靠的方法来清除阻塞。 - Tim Scott
3个回答

6
将此内容放入rake任务中:
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 Scheduler,您可以将其设置为最少10分钟,如果适合的话。

这似乎只适用于Resque 2,现在有人在生产中使用吗?从自述文件中的印象是,你还不应该使用它。 - opsb
看起来 worker.started 会告诉你工作线程最初注册的时间 - 而不是它在当前任务上工作了多长时间。因此,这不是正确的测试方法来判断工作线程是否卡住了。请参见此答案以获取当前任务的开始时间的方法。 - Lachlan Cotter

1

以下代码对我很有效,可以移除正在运行过期作业的特定工人。您可以将其添加到rake任务中。

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

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 任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接