Rails:別のサーバーでバックグラウンドジョブを実行できますか?

beanstalkd delayed-job ruby-on-rails ruby-on-rails-3
Rails:別のサーバーでバックグラウンドジョブを実行できますか?

あるサーバーでアプリケーションをホストし、別のサーバーでジョブをキューに入れることは可能ですか?

可能な例:

  1. 2つの異なるEC2インスタンス、1つはメインサーバー、もう1つは
    キューイングサービス付き。

  2. Herokuでアプリをホストし、キューイングでEC2インスタンスを使用します
    サービス

それは可能ですか?

ありがとう

  4  3


ベストアンサー

はい、間違いなく。 私は、delayed_jobをそのように設定しています。

動作するための要件が​​いくつかあります。

  1. サーバーはクロックを同期する必要があります。 通常、これは問題ではありません
    サーバーのタイムゾーンがすべて同じに設定されている限り。

  2. サーバーはすべて同じデータベースにアクセスする必要があります。

これを行うには、両方(または3つ以上の場合はすべて)のサーバーで同じアプリケーションを使用し、ジョブを処理するサーバーでワーカーを起動します。 どちらのサーバーでもジョブをキューに入れることができますが、実際に処理されるのはワーカーが実行されているジョブのみです。

たとえば、1つの「インターフェイス」サーバー、「db」サーバー、および複数の「ワーカー」サーバーがあります。 interface`サーバーはApache / Passengerを介してアプリケーションを提供し、Railsアプリケーションを db`サーバーに接続します。 Apacheは実行されておらず、httpを介してアプリケーションにアクセスすることはできませんが、「workers」には同じアプリケーションがあります。 一方、delayed_jobsワーカーが実行されています。 一般的なシナリオでは、「インターフェース」サーバーは「db」内のジョブをキューに入れ、「ワーカー」サーバーはそれらを処理します。

注意事項:アプリケーションの物理ファイル(添付ファイル、ログファイル、ダウンロードしたXMLなど)に依存している場合、これらのファイルを保持するためにS3などのソリューションが必要になる可能性があります。 これは、個々のサーバーに実際のファイルがない可能性があるためです。 この例は、ユーザーが自分のプロファイル画像をWebに接続しているサーバーにアップロードした場合、ファイルはそのサーバーに保存される可能性が高いことです。 プロフィール写真のサイズを変更する別のサーバーがある場合、画像はワーカーサーバーに存在しません。

13


別の実行可能なオプションを提供するために、EC2内のクラウドサーバーの弾力性のあるファームに完全に依存するhttp://www.iron.io/worker[IronWorker]のような新しいワーカーサービスを使用できます。

この方法で、実行するジョブをキュー/スケジュールすることができ、複数のサーバーにまたがる大量のスレッドで並列化されます-すべてインフラストラクチャを心配することなく。

ただし、データベースについても同様です。外部からアクセスできる必要があります。

完全な開示:http://www.iron.io/worker[IW]の構築を支援しました。

5


タイトルとURLをコピーしました