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

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

默认的 resque 网络界面显示我有 7 个工作人员中的 5 个在工作。我不明白这怎么会发生。

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

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

最终,我希望我会按照这篇 SO 帖子所说的去做:How do I clear stuck/stale Resque workers? ,但首先我想知道如何确定是否应删除 worker ...我不想盲目地注销 worker ...

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

谢谢!

最佳答案

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

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

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

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

确保您按照 this document 中的规定妥善处理 Resque::TermException .您还可以查看一些 heartbeat solutions其他人想出了解决这个问题的办法。我遇到过问题,即使使用 TERM_CHILD 和适当的信号处理也会让陈旧的工作人员四处漂浮。我的解决方案是等到没有作业正在处理时,注销所有工作人员,然后使用 heroku ps:restart worker 重新启动。

关于ruby-on-rails - 如何检查 Resque worker 状态以确定它是死的还是陈旧的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30111668/

相关文章:

ruby-on-rails - 由于此警告 : [WARNING] You provided devise_for :users but there is no model User defined in your application,设计无法正常工作

node.js - 错误: Cannot find module - Working locally but not on Heroku

ruby-on-rails - Nginx、 unicorn 和 Heroku

css - Heroku 不提供背景图片,localhost 提供吗?

ruby-on-rails - 在 osx 10.8 上安装 ruby​​ 的问题

ruby-on-rails - Rails 设计重置密码不起作用

ruby - 类型不匹配 : String given - Trying to match strings in ruby

node.js - 在 Heroku 上部署 Node.js 应用程序

ruby-on-rails - ActiveRecord 模型测试的性能

ruby-on-rails - Rails:如何修复 ActionView::MissingTemplate 错误?