私は、delayed_job といくつかのバックグラウンド処理の恩恵を受けることができるアプリを手に入れました。問題は、私は本当にdelayed_jobワーカーを常に実行する必要がない/したくないということです。
アプリは、共有ホスティング環境と複数の場所 (異なるユーザー用) で実行されます。さらに、アプリは大量に使用されません。
特定のアクション/イベントの後でのみ、アプリから (スクリプトまたは rake タスクを使用して) ジョブの処理を開始および停止する方法はありますか?
私は、delayed_job といくつかのバックグラウンド処理の恩恵を受けることができるアプリを手に入れました。問題は、私は本当にdelayed_jobワーカーを常に実行する必要がない/したくないということです。
アプリは、共有ホスティング環境と複数の場所 (異なるユーザー用) で実行されます。さらに、アプリは大量に使用されません。
特定のアクション/イベントの後でのみ、アプリから (スクリプトまたは rake タスクを使用して) ジョブの処理を開始および停止する方法はありますか?
システムを呼び出すことができます:
system "cd #{Rails.root} && rake delayed_job:start RAILS_ENV=production"
また、delayed_job を変更してチェック頻度を下げることもできます。デフォルトの 5 秒ではなく、15 分程度に設定します。
ワーカーを停止すると、PID が与えられます。他のすべてが失敗した場合は、単純に -9 PID を強制終了できます。
私がこれを見つけたのは、バックグラウンド ジョブを必要のないときに常に実行するためにすべてのお金を費やすことなく、いくつかのバックグラウンド ジョブを実行する方法を探していたからです。誰かがバックグラウンド ジョブを実行するために Google アプリ エンジンを使用してハッキングを行いました。
http://viatropos.com/blog/how-to-run-background-jobs-on-heroku-for-free/
少し古いですが。スレッドに興味深いコメントがあります。
「メールを送信したり、ファイルをコピーしたりする必要があるときは、基本的にそれをキューに追加します。すべてのリクエストの最後に、キューに何かがあるかどうかを確認します。ある場合は、Heroku API を使用して設定しますワーカーがタスクを完了すると、キューに何か残っているかどうかを確認します. 残っていない場合は、ワーカーを 0 に戻します. 最終結果は、バックグラウンド ワーカーがそのために動作することです.必要なすべてのバックグラウンド処理を行うことができ、月末の請求書が合計 1 時間分の作業に達することはめったにありません。問題がなくても、バックグラウンドに $0.05 を支払います。処理しています。:)」
はい、できますが、どのようなメリットがあるかはわかりません。ワーカーを常に実行したくないとおっしゃっていますが、どのような懸念がありますか? メモリ使用量?データベース接続?
システムへのdelayed_jobの影響を低く抑えるために、ワーカーを1つだけ実行し、ほとんどの時間スリープするように構成します。
Delayed::Worker::sleep_delay = 60 * 5 # in your initializer.rb
単一のワーカーのみが 5 分ごとに起動し、新しいジョブのデータベースをチェックします。このように実行すると、「カスタマイズ」しすぎないようになります。
しかし、本当にプログラムでを開始したい場合Delayed::Worker
は、そのクラスで を探し、独自のスクリプトwork_off
を実装してください。おそらく、 3行script/run_jobs_and_exit
と同じように見えるはずです。script/delayed_job