Rails activejob с Sidekiq порождает несколько заданий на perform_later

У меня есть довольно простое приложение 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 () end

Некоторое время кажется, что это работает, как ожидалось, но через 5 минут или около того две задачи, похоже, в конечном итоге появляются в одно и то же время. В конце концов, каждый из них порождает больше своих, и через несколько дней я получаю десятки тысяч, пытающихся бегать в час. Насколько я могу судить, нет никаких ошибок или сбоев в работе, я не могу найти никакой причины, по которой это могло происходить. Любая помощь будет оценена по достоинству :)


person Michael Curtis    schedule 11.10.2016    source источник


Ответы (1)


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

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

person bithavoc    schedule 11.10.2016