完了するまでに数時間かかる非常に長時間実行される rake タスクの実行に興味があり、この問題に対処するためのベスト プラクティスについて学びたいと考えています。
私が見つけた可能な解決策:
- cron ジョブを設定する
- 遅延ジョブ
- レスキュー
cron はセットアップが簡単なソリューションのように思えますが、非常に長いタスクには理想的ですか? 何を使用し、ソリューションの利点/欠点は何ですか?
完了するまでに数時間かかる非常に長時間実行される rake タスクの実行に興味があり、この問題に対処するためのベスト プラクティスについて学びたいと考えています。
私が見つけた可能な解決策:
cron はセットアップが簡単なソリューションのように思えますが、非常に長いタスクには理想的ですか? 何を使用し、ソリューションの利点/欠点は何ですか?
個人的には Resque が大好きです。resque-scheduler gem を使用して、長時間実行されるタスクや定期的なタスクを処理できます。
タスクを頻繁に実行する必要がない場合は、rake タスクをデーモン化して、SSH セッションが終了した場合などに実行し続けるようにすることができます。
次のようなことを試してください:
nohup rake my:task &
nohup
タスクを実行するディレクトリに出力を送信しnohup.out
、プロセスを停止せずに ssh セッションを終了させます。次に、&
デーモンとして実行します。
私が作成した1つのアプリケーションでは、ユーザーはアップロード時にサムネイル化されたPDFをアップロードしてプレビュー画像を作成することができました。PDFは非常に大きくなる可能性があるため、サムネイル作成には時間がかかり、バックグラウンドで実行する必要がありました。これを行うために、私は使用しました
プラス面としては、気の利いたResque GUIを使用して、作業中のワーカーを表示できます。また、暴走するプロセス(処理中にかなり発生する傾向があります)を監視(および強制終了して再起動)する神がそこにいます。 ImageMagickのPDF)、全体をはるかに安定させ、信頼性を高めます。
マイナス面としては、cronジョブよりもセットアップが非常に困難です。しかし、cronに監視されていない長い、メモリを大量に消費するプロセスを実行させることは、私にとって災害のレシピのように思えます。
お役に立てば幸いです。