如何检查 Resque worker 状态以确定它是死的还是陈旧的

How to check Resque worker status to determine whether it's dead or stale

默认的 resque 网络界面显示我有 7 个工人中的 5 个在工作。我不明白这是怎么回事。

我在 heroku 上,所以当我的 dyno 重新启动时,它应该停止现有的 dynos 和 worker,然后启动新的。所以,我假设这些工人中有一些是陈旧的,但 resque 认为工作的工人比应该有的要多得多......(应该只有 1 个)

我如何检查其中的任何一个是陈旧的还是死的?我预计只有 1 名工人在工作。

最终,我希望我会按照 SO post 所说的进行操作:How do I clear stuck/stale Resque workers?,但是 首先我想知道如何确定一个工人是否应该删除...我不想盲目注销工人...

如果这是一个明显的问题,我们深表歉意。我是 resque 新手。

谢谢!

试试这个:

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

确定工人是否真正工作的唯一方法是检查工人的主机。在 Heroku 上重启后,这台机器不再存在,所以如果工作人员没有自行注销,Resque 将认为它仍在工作。 Resque worker 的去中心化特性意味着您无法轻松查看 worker 的实际状态。当每个 worker 启动时,它都会在 redis 中注册自己。当那个工人开始工作并再次开始工作时,它会在 redis 中注册它的状态。当你像这样迭代时:

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

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

resque-web 显示中的主机名将与您在 heroku 日志输出中看到的名称匹配,因此这不是查看实际内容的好方法 运行。我希望可以通过使用从平台 API 获得的测力计 ID 来实现自动化,但它们与主机名不匹配。

确保您按照 this document. You could also look into some of the heartbeat solutions 中指定的方式优雅地处理 Resque::TermException 其他人提出的解决此问题的方法。我遇到过问题,即使使用 TERM_CHILD 和适当的信号处理也会让陈旧的工作人员四处漂浮。我的解决方案是等到没有作业正在处理时,注销所有工人,然后用 heroku ps:restart worker 重新启动。