2016-10-11 10 views
0

У меня довольно простое приложение Rails 5 для мониторинга скорости сайтов. Он отправляет задания в службу проверки скорости внешней страницы и периодически проверяет, завершены ли задания, и, если это так, он вызывает и сохраняет данные о странице.Rails activejob with Sidekiq создает множество заданий на perform_later

Каждый проект может иметь много страниц, и каждая страница может иметь много заданий, в которых хранится ответ от службы тестирования.

Существует активная сторона с боковым сервером 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 минут или около двух рабочих мест, похоже, в конечном итоге появляются нерестилища. В конце концов каждый из них порождает больше своих собственных, и через несколько дней я получаю десятки тысяч попыток запуска в час. Нет никаких ошибок или неудачных заданий, насколько я могу судить, я не могу найти причин, почему это произойдет. Любая помощь была бы оценена mundo :)

ответ

1

Есть вероятность того, что задания будут повторены из-за сбоев, которые при перекрытии с регулярным графиком на 60 секунд могут привести к двойному планированию, которое вы испытываете. Для получения дополнительной информации см. Error Handling в вики Sidekiq.

BTW Я не совсем уверен, что активная работа это лучший способ, чтобы запустить периодические задачи (если предприятие вы используете sidekiq в periodical-jobs). Вместо этого я хотел бы использовать хроны запуск задачи Rake каждые 60 секунд, задача рек бы планировать работу, чтобы проверить конкретные страницы QueuejobsJob.perform_later page.id