(RAILS) Зацикливание пользовательских рейков каждые 2 минуты, плохая идея Лучший способ реализовать? - PullRequest
1 голос
/ 14 июня 2009

В настоящее время я создал пользовательский файл граблей, который выполняет следующие действия:

1.) Проверяет внешнюю подачу для «НОВЫХ» предметов

2.) Для каждого нового элемента в массиве каналов он обновляет мою базу данных новой записью

3.) У меня сейчас есть цикл WHILE. Цикл while имеет переменную экземпляра (@loopcheck), для которой изначально установлено значение true, и если возникает какое-либо исключение. Сбрасывает его на false (чтобы цикл завершился).

Вот пример:

   While(@loopcheck) do 
      begin
       ....(code here)...
      rescue
        Exception => e
        @loopcheck = false
      end
      sleep(120)
   End

Это плохое кодирование? Есть лучший способ сделать это? В идеале я просто хочу запустить фоновую задачу, чтобы просто проверять новый канал каждые 2-3 минуты. Я посмотрел на Starling / Workling, но это выглядело немного излишним, и я не был уверен в том, чтобы запускать скрипт / бегун через CRON, так как он каждый раз перезагружает всю среду rails. BackgroundRB тоже немного излишним? Нет?

Просто хотел получить несколько идей.

Ответы [ 3 ]

2 голосов
/ 14 июня 2009

Проверьте этот последний Railscast на "Всякий раз"

ссылка здесь и комментарии обсуждают альтернативы

http://railscasts.com/episodes/164-cron-in-ruby

2 голосов
/ 14 июня 2009

Объедините крон со сном. Это гарантирует, что все не сломается полностью, если вы нажмете исключение. Загрузка "полной среды рельсов" не так уж и плоха: худший случай - 3-6 секунд так запустите свой цикл сна 5 раз. и cron грабли задачи для запуска каждые 12 минут. Имеет смысл?

*/12 * * * * rake your task

## your rake task - valid for 10 mins -- 5 x 2 mins sleep worth.

@loopcheck = true

1.upto(5) do 
    begin
       ....(code here)...
    rescue
      Exception => e
      @loopcheck = false
    end
    break if not @loopcheck
    sleep(120)
end
0 голосов
/ 14 июня 2009

Самое простое, что может сработать, если вы работаете в Unix-системе, - запускать скрипт раз в две минуты из cron, без цикла / сна. Это позволяет избежать мониторинга и перезапуска скрипта в случае его сбоя. И если это не удастся, cron отправит вам электронное письмо.

Недостатком этого подхода, как вы заметили, является то, что каждые две минуты вы получаете удар по запуску процесса Ruby. Это важно? Только ты можешь сказать. У меня есть несколько таких скриптов на слегка загруженной коробке, и я забыл, что они даже там.

...