如何检查Resque worker status以确定它是死还是陈旧

时间:2015-05-07 21:07:31

标签: ruby-on-rails ruby-on-rails-3 heroku redis resque

默认的resque web界面说我有7名工作人员中有5人在工作。我不明白这是怎么发生的。

我正在使用heroku,所以当我的dyno重新启动时,它应该关闭现有的dynos和worker,然后再启动新的dynos和worker。所以,我假设其中一些工人是陈旧的,但是resque认为工作人员比应该工作的人多得多......(应该只有1人)

如何判断这些是陈旧还是死亡?我希望看到只有一名工人在工作。

最终,我希望我会做任何这样的帖子说:How do I clear stuck/stale Resque workers?,但首先我想知道如何确定是否应该删除一名工人......我不知道我想盲目地注销工人......

如果这是一个明显的问题,请道歉。我是新来的人。

谢谢!

2 个答案:

答案 0 :(得分:13)

确定工人是否实际工作的唯一方法是检查工作人员的主机。在Heroku上重启后,这台机器不再存在,所以如果工作人员没有取消注册,Resque会相信它仍然有效。 Resque工作人员的分散性意味着您无法轻易检查工人的实际状况。当每个工作人员启动时,它会使用redis进行注册。当该工作人员拿起工作并开始工作时,再次使用redis注册其状态。当你这样迭代时:

Resque.workers.each { |w| w.working? }

您正在从redis中提取工人列表,并从redis中检查这些工作人员的最后注册状态。它实际上并不查询工作者本身。

resque-web显示中的主机名将与您在heroku日志输出中看到的名称相匹配,这是查看实际运行情况的一种不太好的方法。我希望通过使用从平台API获得的dyno ID进行自动化,但它们与主机名不匹配。

确保按照this document中的说明正确处理Resque::TermException。您还可以查看一些heartbeat solutions其他人提出的解决此问题的方法。我遇到过一些问题,即使使用TERM_CHILD并且正确的信号处理也会使陈旧的工人浮动。我的解决方案是等到没有处理任何作业,取消注册所有工作人员,然后使用heroku ps:restart worker重新启动。

答案 1 :(得分:3)

试试这个:

Resque.workers.each do |w| 
  if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 7.days
    w.unregister_worker
  end
end