遅延ジョブまたは同様のスケジュール フレームワークを Web サーバー内で実行できますか。薄いかユニコーン?はいの場合、どうすれば開始できますか? (コード例は非常にクールです!)
その理由は、アプリケーションがビルドアップ段階にあり、heroku でホストされている間にお金を節約したいからです。
遅延ジョブまたは同様のスケジュール フレームワークを Web サーバー内で実行できますか。薄いかユニコーン?はいの場合、どうすれば開始できますか? (コード例は非常にクールです!)
その理由は、アプリケーションがビルドアップ段階にあり、heroku でホストされている間にお金を節約したいからです。
いいえ、Web フレームワーク内でdelayed_jobs を非同期に実行する方法はサポートされていません。ジョブの実行に関するドキュメントから、ジョブを実行する唯一のサポートされている方法は、rake タスクまたは遅延ジョブ スクリプトを実行することのようです。また、受信クライアント要求を処理するように設計されたラック サーバーを曲げて、どこかのキューからタスクをプルすることをサポートすることは、概念的に間違っているようです。
とはいえ、お金を節約することは、概念的に完璧であることよりも勝る場合があることを理解しています. これらの rake タスクを見てください。私の面倒は、離れた場所から定期的にアクセスする Rails サーバーに特別なエンドポイントを作成することです。このエンドポイント内で、 a をインスタンス化し、オプションでそれをDelayed::Worker
呼び出します。この方法では、新しい dyno やコマンドは必要ありません。.start
exit_on_complete
注意してください、これは一種の厄介な解決策であり、遅延したすべてのジョブが完了するまで、Rails プロセスの 1 つを拘束します。つまり、他のレール プロセスがない限り、このキュー リクエストが終了するまで、すべての着信リクエストがブロックされます。Unicorn は、ワーカー プロセスを生成する機能を提供します。このソリューションが機能するかどうかは、ジョブとその実行にかかる時間、およびアプリケーションの遅延許容度にも依存します。
編集
spawnDelayed::Worker
gem を使用すると、 のインスタンス化をブロックでラップできます。これspawn
により、ジョブが別のプロセスで実行されます。これは、レール プロセスが遅延ジョブの実行中にブロックされるのではなく、すぐに Web リクエストを処理できるようになることを意味します。ただし、spawn gem にはいくつかの依存関係がActiveRecord
あり、どの DB/ORM を使用しているかわかりません。
少し曖昧になってきているので、いくつかのコード例を次に示します。
class JobsController < ApplicationController
def run
spawn do
@options = {} # youll have to get these from that rake file
Delayed::Worker.new(@options.merge(exit_on_complete: true)).start
end
end
end
同様の質問へのリンクは次のとおりです。
Heroku dynoで複数のプロセスを実行することは可能ですか?
投稿にあるように、Web dynoを1つだけ使用している場合、トラフィックがない場合はシャットダウンされることに注意してください。
同様に、次のことを調べることができます。
http://blog.codeship.io/2012/05/06/Unicorn-on-Heroku.html
アプリのビルド中に複数のWebdynoの必要性を節約するため(ただし、上記のシャットダウンの問題は引き続き発生します)。
HerokuではなくVPSで直接実行することを検討することをお勧めします(railscastを確認してください)。
http://railscasts.com/episodes/337-capistrano-recipes
一度設定すると、展開は非常に簡単です。Herokuは、devops部分を切り取ります。
Unicorn の別のワーカー内で実行できるため、マスター プロセスとメモリを共有し、アプリと共に再起動されます。