2012-12-11 2 views
2

Я разрабатываю приложение Rails, которое дает данные о ценах на различные продукты, соскабливая цены со сторонних сайтов (аналогично http://railscasts.com/episodes/190-screen-scraping-with-nokogiri).Периодические фоновые задания на Rails & Heroku

Поскольку я новичок в программировании, сейчас я вручную делаю это, поставив свой код в граблированную задачу. Задачи проходят через все продукты в моей базе данных и обновляют их цену скремблированием. Это займет несколько часов (так как есть 1000 продуктов), но большую часть времени тратит от звонка сон, поэтому я могу оценить лимит самостоятельно. Прямо сейчас я вызываю задачу rake вручную из командной строки, но я бы хотел иметь недельное периодическое задание, которое автоматически запускается в фоновом режиме.

После небольшого исследования, похоже, есть несколько способов сделать это (Resque, DelayedJob, Cron/Whenever), но я не уверен, что лучше всего соответствовало моей потребности. Кроме того, я развертываю через Heroku, поэтому я хочу убедиться, что я не трачу деньги на рабочих динозавров; прямо сейчас это просто побочный проект, поэтому я не хочу тратить столько.

Что было бы простым и экономичным способом сделать это?

ответ

6

В настоящее время я использую Heroku Scheduler. Он может запускать задачи каждый день, каждый час или каждые 10 минут. Это чрезвычайно прост в использовании:

  1. Установите надстройку с heroku addons:add scheduler:standard
  2. Перейдите в приложение на веб-сайте Heroku, выберите Планировщик дополнения и добавить новое задание. Вы делаете это, определяя задачу (rake name_of_your_task), частоту и следующий прогон. И сделано.

Есть, однако, несколько проблем:

  1. Вы должны предоставить действительную кредитную карту, чтобы иметь возможность использовать это дополнение, хотя это, в принципе, бесплатно.

  2. Планировщик запускает разовые процессы, которые будут учитываться в соответствии с вашими динамическими часами.

  3. Heroku дает вам всего 750 бесплатных динозанов для каждого приложения.

Это то, что вики планировщика должен сказать о Long-running jobs:

Запланированные задания предназначены для выполнения коротких запущенных задач или епдиеие больше запущенных задач в очереди фонового задания. Все, что требуется дольше, чем за пару минут до завершения, должно использовать рабочий dyno для запуска.

Так что мой совет здесь будет:

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

  2. Выполнять эти задачи более периодически (у вас даже нет еженедельного варианта с помощью Планировщика).

  3. Следите за своими динамическими часами.Вы можете сделать это here. 750 часов составляют 31 день и 6 часов. Таким образом, у вас есть как минимум 6 часов для работы в эти 31-дневные месяцы. Если ваше приложение не используется, вы также можете использовать следующую команду, чтобы отключить его, чтобы он не подсчитывал обычные часы динамо.

    heroku ps:scale web=0 
    

    И вы можете масштабировать его обратно с

    heroku ps:scale web=1 
    

К сожалению, нет такой вещи, как свободные вычислительные мощности.

+1

Ничего себе, теперь, когда я смотрю на этот ответ, мне действительно нужны списки: D – Ashitaka

+0

Если я не могу сломать свои задания на более мелкие куски, любые предложения о том, что я должен делать? – slykat

+0

Что вы пробовали? Вы очищаете только страницы, которые вы определили? Если да, то вы можете поместить их внутри массива и иметь функцию, которая в зависимости от дня недели начинается с определенного индекса и заканчивается другим индексом массива. Если вы очищаете тонну страниц, которые вы не определили, вы можете установить жесткий предел. Например, 1000 продуктов в день. Таким образом, у вас должен быть счетчик, и когда он достигнет 1000, вы сохраните URL-адрес или идентификатор следующей страницы, которую хотите отменить, и продолжите на следующий день, когда вы остановились. – Ashitaka

Смежные вопросы