【问题标题】:Rails activejob with Sidekiq is spawning multiple jobs on perform_later带有 Sidekiq 的 Rails activejob 在 perform_later 上产生了多个作业
【发布时间】: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


    【解决方案1】:

    有可能由于失败而重试作业,当与常规 60 秒计划重叠时,可能会导致您遇到双重计划。有关详细信息,请参阅 Sidekiq wiki 中的 Error Handling

    顺便说一句我不完全确定一个活跃的工作它是运行定期任务的最佳方式(除非你使用 sidekiq 的企业 periodical-jobs)。相反,我会使用 cron 作业每 60 秒运行一次 rake 任务,即 rake 任务将安排作业检查特定页面 QueuejobsJob.perform_later page.id

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      相关资源
      最近更新 更多