2016-10-11 46 views
0

我有一個相當簡單的Rails 5應用程序來監控網站速度。它將作業發送到外部頁面速度測試服務,並定期檢查作業是否完成,如果是,則調用並存儲關於頁面的數據。與Sidekiq的Rails activejob在perform_later上產生多個作業

每個項目可以有多個頁面,並且每個頁面可以有多個作業,這是存儲測試服務響應的地方。

有一個activejob,帶有一個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(等待:1.minute).perform_later() 結束

這似乎是工作作爲預計會有一段時間,但5分鐘左右後,兩個工作似乎最終同時產卵。最終每個人都會自己創造更多的東西,幾天之後,我每小時就會有成千上萬的人試圖跑步。盡我所知,沒有任何錯誤或失敗的工作,我找不到任何原因會發生。任何幫助將被讚賞:)

回答

1

有一個機會重新審視失敗的工作,如果與正常的60秒時間表重疊,可能會導致你正在經歷的雙重調度。有關更多信息,請參閱Sidekiq wiki中的Error Handling

BTW我不能完全肯定,積極的工作是運行週期任務(除非您使用sidekiq的企業periodical-jobs)的最佳途徑。相反,我會使用一個cron作業運行rake任務每60秒,耙 任務將調度作業檢查 QueuejobsJob.perform_later page.id

特定頁面
相關問題