【发布时间】:2017-02-19 21:33:59
【问题描述】:
我有一个相当简单的 Rails 5 应用程序来监控网站速度。它将作业发送到外部页面速度测试服务,并定期检查作业是否完成,如果完成,它会调用并存储有关页面的数据。
每个项目可以有很多页面,每个页面可以有很多作业,这是存储测试服务响应的地方。
有一个带有 sidekiq 后端的活动作业,它应该每分钟运行一次,检查要运行的页面,如果发现任何页面,则启动一个作业以将其排入队列。它还检查是否有任何排队的作业,如果找到它们,它会启动一个作业来检查状态并在完成时保存数据。
def perform()
#Todo:- Add some way of setting the status into the view and check for active here - no way to stop jobs at the mo!
pagestorun = Page.where("runtime < ?", DateTime.now)
pagestorun.each do |page|
job = Job.new(:status => "new")
page.jobs << job
updatedatetime(page)
end
if pagestorun.count != 0
#Run the queuejob task to pick out all unqueued jobs and send them to webpagespeedtest
QueuejobsJob.perform_later
end
#检查队列中的任何作业,然后调度下一个任务 GetrunningtasksJob.perform_later FindjobstorunJob.set(wait: 1.minute).perform_later() 结束
这似乎在一段时间内按预期工作,但大约 5 分钟后,两个作业似乎最终同时生成。最终,它们中的每一个都会产生更多自己的东西,几天后,我最终有成千上万的人试图每小时运行。据我所知,没有错误或失败的工作,我找不到任何原因会发生这种情况。任何帮助将不胜感激:)
【问题讨论】:
标签: ruby-on-rails sidekiq ruby-on-rails-5 rails-activejob