2012-02-08 10 views
4

私たちは、毎晩各ユーザーのためにデータをスクラップして処理する必要がある、HerokuのRailsプロジェクトに取り組んでいます。これには1人のユーザーに多くのインターネットアクセスが必要であり、何万人ものユーザーをサポートできることを望んでいます。複雑な解析、計算、および関連するデータベースへの書き込みがありますが、タスクの時間の大半はネットワークからのデータを待つのに費やされることが予想されます。ヘロクのナイトリーバッチネットワークタスク

壁掛け時間とHeroku料金の両方を最小限に抑えながら、このタスクを実行する最も一般的な方法は何ですか?明らかに、ネットワークの待機に費やされる時間を利用するには、並行性または非同期ネットワークのいずれかが必要ですが、どうすればよいでしょうか?フォークされたワーカープロセスを使用したデータベースバックアップキューについて考えていますが、これは最善のアプローチではないかもしれませんし、Herokuでも可能ではないかもしれません。

+0

システム上のユーザーの数に応じて掻き分け/解析の尺度が変化するかどうかについては言及していません。 –

+0

これは、各ユーザーが掻き取らなければならない別のページセットに対応しています。 –

答えて

7

Heroku supports Delayed Job、そこから開始します。あなたは次のことが可能です。シングルユーザー用

  • 処理を行うジョブ・クラスを作成
  • スケジュールシステム内のすべてのユーザーのためのジョブを作成しnightly cron
  • あなたの労働者への自動スケーリングジョブキュー(worklessまたは類似があなたのためにこれを行うことができるはずです。そうでない場合、あなたには、いくつかのカスタムコードをロールバックする必要があります。)対応

あなたは数字にあなたの労働者/ジョブ比でプレーする必要がありますdb負荷、壁を越えて最適化するためのスイートスポットを出す時計の時間とヒロクのコスト。

各ジョブがネットワークを待つのにあまりにも多くの時間を費やしていることがわかっている場合は、eventmachineをご覧ください。ジョブはちょうどルビーコードなので、ここで必要とする並列化の技を何でも演奏することができます。Herokuは決してあなたを制限しません。

この設定は、スピンアップに時間がかかりすぎないようにするためにはかなり良いベースラインになるでしょう。おそらく、あなたの仕事の負荷について少し学ぶでしょう。

あなたは1人のジョブ/ユーザーが意味をなさないことがあり、ユーザーごとにn個のジョブが必要であることが分かります(プロパティごとに1つのジョブなど)。あなたの正確なユースケースを知らなければ、正面から言うことは難しいので、私は1-1のマッピングを想定しています。

新しいHerokuスタックsupports queueing systems other than Delayed Job(下からスクロール)も指摘する必要があります。

2

遅れているジョブは素晴らしいです、私は心からそれをお勧めします。 HireFireの宝石を加えれば、この宝石は、仕事のバックログが蓄積しているときに自動的に作業者プロセスの数を増やし、仕事がないときには作業者を停止させます。ただし、HireFireを使用している場合は、将来実行するジョブをスケジュールしないでください。HerokuのCronアドオンによって実行されるレーキタスクの中で、実行したいときにキューに入れるだけです。

ジョブのバックログが増えるにつれて、HireFireが使用するワーカーの最大数とワーカーを追加する方法を構成できます(HireFireは、将来のジョブをスケジュールしようとするとワーカープロセスを正しく起動しません)。 。これにより、拡張が非常に簡単になります。スクレイピング/解析ジョブ(1つのジョブで処理されるユーザー数は100〜1000人)に適した「グレインサイズ」を選択する必要があります。次に、Cronタスク内で、すべてのユーザーを適切なサイズのグループに分け、各グループのバックグラウンドジョブをキューに入れ、HireFireで適切な数のワーカープロセスを開始させて、すべてのジョブを速やかに完了させます。

これは依然として、ダイナモ時間のコストを最小限に抑えるという問題を残しています。私は最近、私が構築していたRailsサイトで同じ問題を処理しました...

サイトは、delayed_jobバックグラウンドワーカーを使用して、さまざまなWebサービスからデータを取得します。私は自分自身で構築した並列map-reduceユーティリティを使用して、複数のHTTPリクエストを並行して実行することにより、そのデータプルジョブのパフォーマンスを10倍近く向上させました。

私はそのマップ-削減、実装上のいくつかのより多くの仕事をするつもりが、あなたが今、それを使用したい場合は、あなたがそれに歓迎されている:待機時間/処理時間のhttps://github.com/alexdowad/showcase/blob/master/ruby-threads/threads.rb

高いあなたの比でありますあなたはより多くの利益を得るために立つ。そのユーティリティを使用するバックグラウンドジョブコードのサンプルを希望するかどうかを教えてください。