遅れているジョブは素晴らしいです、私は心からそれをお勧めします。 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
高いあなたの比でありますあなたはより多くの利益を得るために立つ。そのユーティリティを使用するバックグラウンドジョブコードのサンプルを希望するかどうかを教えてください。
システム上のユーザーの数に応じて掻き分け/解析の尺度が変化するかどうかについては言及していません。 –
これは、各ユーザーが掻き取らなければならない別のページセットに対応しています。 –