【问题标题】:How to check Resque worker status to determine whether it's dead or stale如何检查 Resque 工作人员状态以确定它是死的还是陈旧的
【发布时间】:2015-07-18 15:38:35
【问题描述】:

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

我在 heroku 上,所以当我的测功机重新启动时,它应该关闭现有的测功机和工作人员,然后启动新的测功机。所以,我假设其中一些工人已经过时了,但 resque 认为工作的工人比应有的要多得多……(应该只有 1 个)

我如何检查其中任何一个是否过时或已死?我预计只有 1 名工人在工作。

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

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

谢谢!

【问题讨论】:

  • 正如我在问题中提到的,我已经知道互联网似乎认为我的问题的最终解决方案是(致电unregister_worker)。我不清楚为什么您在实际运行此代码之前不检查是否可以取消注册工作人员。如果你运行它时有一个worker当前正在运行怎么办?盲叫unregister_worker有什么副作用?
  • 另外,将我链接到所有工作人员文档也无济于事。我显然不明白从哪里开始。我应该在那里引用哪种方法?

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


【解决方案1】:

确定工作人员是否实际工作的唯一方法是检查工作人员的主机。在 Heroku 上重新启动后,这台机器不再存在,所以如果工人没有注销自己,Resque 会相信它仍然在工作。 Resque 工作人员的分散性质意味着您无法轻松检查工作人员的实际状态。当每个工人启动时,它都会向 redis 注册自己。当那个工人拿起一份工作并开始工作时,它会再次向 redis 注册它的状态。当你这样迭代时:

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

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

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

确保您按照this document 中的规定优雅地处理Resque::TermException。您还可以查看其他人提出的一些heartbeat solutions 来解决此问题。我遇到了一些问题,即使使用TERM_CHILD 和适当的信号处理也会让陈旧的工作人员四处游荡。我的解决方案是等到没有工作正在处理,注销所有工作人员,然后使用heroku ps:restart worker 重新启动。

【讨论】:

  • 这是一个很好的答案。我的情况是有很多工作人员一直在为我的应用程序工作。等到没有工作正在处理时,这不是一个可行的选择,但感谢您的回答!
  • 一个小补充。如果您想查看当前正在运行的工作人员,您应该使用 select:Resque.workers.select { |w| w.working? }
【解决方案2】:

试试这个:

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

【讨论】:

  • 这可能是我能得到的最佳答案。陈旧的工人仍然认为他们正在做某事,所以我不能真正使用像 processingworking? 这样的普通标志...
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 2016-08-25
  • 2011-07-24
  • 2016-05-23
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多