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