use*_*421 20 ruby-on-rails heroku resque redis ruby-on-rails-3
默认的resque web界面说我有7个工作中的5个工作.我不明白这是怎么回事.
我正在使用heroku,所以当我的dyno重新启动时,它应该关闭现有的dynos和worker,然后启动新的dynos和worker.所以,我假设这些工人中的一些是陈旧的,但是resque认为工作人员比应该工作的人多得多......(应该只有1人)
如何检查这些是否陈旧或死亡?我希望看到只有一名工人在工作.
最终,我希望我会做任何这样的帖子说:我如何清除卡住/陈旧的Resque工作人员?,但首先我想知道如何确定是否应该移除一名工人......我不想盲目地注销工人......
如果这是一个显而易见的问题,请道歉.我是新来的.
谢谢!
Luk*_*und 13
确定工人是否实际工作的唯一方法是检查工作人员的主机.在Heroku上重启后,这台机器不再存在,所以如果工作人员没有取消注册,Resque会相信它仍然有效.Resque工作人员的分散性意味着您无法轻易检查工人的实际状况.当每个工作人员启动时,它会使用redis进行注册.当该工作人员拿起工作并开始工作时,再次使用redis注册其状态.当你这样迭代时:
Resque.workers.each { |w| w.working? }
Run Code Online (Sandbox Code Playgroud)
你从redis中提取了一份工人名单,并从redis中查看这些工人的最后登记状态.它实际上并不查询工作者本身.
resque-web显示中的主机名将与您在heroku日志输出中看到的名称相匹配,这是查看实际运行内容的一种不太好的方法.我希望通过使用从平台API获得的dyno ID进行自动化,但它们与主机名不匹配.
确保Resque::TermException按照本文档中的规定进行优雅处理.您还可以查看其他人提出的一些心跳解决方案来解决此问题.我有一些问题,即使使用TERM_CHILD和正确的信号处理使陈旧的工人漂浮在周围.我的解决方案是等到没有处理任何作业,取消注册所有工作人员,然后重新启动heroku ps:restart worker.
尝试这个:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4102 次 |
| 最近记录: |