2

遅延ジョブまたは同様のスケジュール フレームワークを Web サーバー内で実行できますか。薄いかユニコーン?はいの場合、どうすれば開始できますか? (コード例は非常にクールです!)

その理由は、アプリケーションがビルドアップ段階にあり、heroku でホストされている間にお金を節約したいからです。

4

3 に答える 3

3

正式に

いいえ、Web フレームワーク内でdelayed_jobs を非同期に実行する方法はサポートされていません。ジョブの実行に関するドキュメントから、ジョブを実行する唯一のサポートされている方法は、rake タスクまたは遅延ジョブ スクリプトを実行することのようです。また、受信クライアント要求を処理するように設計されたラック サーバーを曲げて、どこかのキューからタスクをプルすることをサポートすることは、概念的に間違っているようです。

クラッジ

とはいえ、お金を節約することは、概念的に完璧であることよりも勝る場合があることを理解しています. これらの rake タスクを見てください。私の面倒は、離れた場所から定期的にアクセスする Rails サーバーに特別なエンドポイントを作成することです。このエンドポイント内で、 a をインスタンス化し、オプションでそれをDelayed::Worker呼び出します。この方法では、新しい dyno やコマンドは必要ありません。.startexit_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
于 2013-02-18T17:29:48.333 に答える
1

同様の質問へのリンクは次のとおりです。

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部分を切り取ります。

于 2013-02-18T16:53:34.523 に答える
0

Unicorn の別のワーカー内で実行できるため、マスター プロセスとメモリを共有し、アプリと共に再起動されます。

https://gist.github.com/brauliobo/11298486を参照してください。

于 2015-05-14T23:36:06.563 に答える