2

サードパーティのサイト ( http://railscasts.com/episodes/190-screen-scraping-with-nokogiriに似ています) から価格をスクレイピングして、さまざまな製品の価格データを提供する Rails アプリを開発しています。

私はプログラミングが初めてなので、今は自分のコードを rake タスクに入れて手動で行っています。タスクはデータベース内のすべての製品をループし、スクレイピングによって価格を更新します。完了するまでに数時間かかりますが (何千もの製品があるため)、ほとんどの時間は スリープの呼び出しに費やされているため、レート制限を自分で行うことができます。現在、コマンド ラインから rake タスクを手動で呼び出していますが、バックグラウンドで自動的に実行される毎週の定期的なジョブが必要です。

少し調査した結果、これを行うにはいくつかの方法があるようです ( Resque 、 DelayedJob 、 Cron/Whenever ) が、どれが私のニーズに最も適しているかわかりません。さらに、私は Heroku を介してデプロイしているので、ワーカー dyno でお金を無駄にしないようにしたいと考えています。今のところこれは単なるサイド プロジェクトなので、あまりお金をかけたくありません。

これを行うための簡単で費用対効果の高い方法は何でしょうか?

4

1 に答える 1

6

現在、Herokuスケジューラを使用しています。毎日、1時間ごと、または10分ごとにタスクを実行できます。使い方は非常に簡単です。

  1. アドオンをインストールするheroku addons:add scheduler:standard
  2. Heroku Webサイトでアプリに移動し、Schedulerアドオンを選択して、新しいジョブを追加します。rake name_of_your_taskこれを行うには、タスク( )、頻度、および次の実行を定義します。そして完了。

ただし、いくつかの問題があります。

  1. 原則として無料ですが、このアドオンを使用するには、有効なクレジットカードを提示する必要があります。

  2. スケジューラーは、ダイノアワーにカウントされる1回限りのプロセスを実行します。

  3. Herokuでは、アプリごとに750時間の無料dyno時間しか提供されません。

これは、スケジューラのwikiが長時間実行ジョブについて述べていることです。

スケジュールされたジョブは、実行時間の短いタスクを実行するか、実行時間の長いタスクをバックグラウンドジョブキューにエンキューすることを目的としています。完了するまでに数分以上かかるものは、workerdynoを使用して実行する必要があります。

したがって、ここでの私のアドバイスは次のようになります。

  1. レーキタスクを、数分間だけ実行することを目的とした小さなチャンクに分割します。

  2. これらのタスクをより定期的に実行します(スケジューラーを使用する毎週のオプションもありません)。

  3. あなたのdyno時間に目を離さないでください。ここでそうすることができます。750時間は31日と6時間になります。したがって、これらの31日間で少なくとも6時間作業する必要があります。アプリを使用していない場合は、次のコマンドを使用してアプリをオフにし、通常のdyno時間のカウントを停止することもできます。

    heroku ps:scale web=0
    

    そして、あなたはそれをスケールアップすることができます

    heroku ps:scale web=1
    

残念ながら、無料の計算能力などはありません。

于 2012-12-11T03:11:25.190 に答える