乔布斯神奇地从队列中消失(heroku上的delayed_job mongoid 2)

时间:2012-10-19 02:11:46

标签: ruby-on-rails ruby heroku mongoid delayed-job

让我说我喜欢

arrs = Article.where(:body => nil)

我将拥有arrs.count,让我们说900 我做了

arrs.each do |ar|
  ar.delay.download_via_diffbot #a method that takes some time, does some http, and writes a non-nil value to ar.body
end

现在我会看日志,并等待几分钟~5个dynos完成这些工作,并再次计算:arrs.count现在是~800

所以wtf,我以为我只是告诉我的工人要做900个工作,其他800个怎么办?

我可以确认我只发出了~100个HTTP请求,但是api报告显示了这一点,还只是看着日志告诉你900个工作没有发生。


我正在关注Delayed :: Job.count,并且只有大约100个从该循环创建,即使有多个作业以

开头

我是否错误地创建了这么多同时工作? 什么是一次创造这么多工作的正确方法?

1 个答案:

答案 0 :(得分:1)

Mongoid标准是延迟加载/评估的。也就是说,如果设置articles = Article.where(body: nil),文章就是一个标准。它不是您从db获得的文档集。因此,如果您删除一些带有正文nil的文章或填写一些文章的正文,articles.count将触发另一个数据库查询,并仅报告正文为零的文章数。如果您的延迟工作人员成功地完成工作并填写身体内容,则可以减少计数。

PS:问题不是很清楚,我只是回答了我理解的问题。

<强>更新

您可以Delayed::Job.count查看延迟的作业计数,以查看任何时候待处理的作业数量。如果您没有删除失败的作业,则可以按Delayed::Job.where(:failed_at.ne => nil).count检查失败作业的计数。要查看有关失败作业的更多详细信息,可以检查作业,它将具有处理程序和上次错误。