2011-02-03 9 views
4

私は、特定のイベントをキューに書き込むレール3アプリケーションを持っています。キューイベントに反応するRubyの長時間実行プロセス

サーバー上で、x秒ごとにキューをポーリングし、スケジュールに基づいて他のタスクを実行するサービスを作成したいとします。

ルビースクリプトを作成してcronジョブで実行する以外に、安定した代替手段がありますか?

答えて

5

永続的なRailsのベースのタスクをスピンアップするオプションですが、あなたが望むことdelayed_jobまたはStarlingのようなより整然としたシステムを見て、作業負荷を管理してください。

cronで何かを実行しないことをお勧めします.Railsスタック全体をスピンアップさせる費用が重大なものになる可能性があるからです。あなたのハードウェアによっては、Railsの立ち上げ時間が通常5〜15秒であるため、数秒おきに実行するのは実用的ではありません。これを1日に数回行うのは、大したことではありません。

簡単な選択肢は、あなたがrunnerと係合可能なスクリプトでワークループを作成することです:

interval = 15.minutes 
next_time = Time.now + interval 

while (true) 
    if (stuff_to_do?) 
    do_stuff 
    end 

    # Figure out how much time is left before the next iteration 
    delay = next_time.to_i - Time.now.to_i 

    if (delay > 0) 
    # If ahead of schedule, take a break 
    sleep(delay) 
    end 
end 

この方法の欠点は、Railsのスタックがいる限り、このバックグラウンド・プロセスが実行されているように、メモリに残ることですしかし、これは巨大なCPUヒットとメモリヒットとの間のトレードオフです。

+0

多分スカラーの何かがより効果的でしょうか? – Blankman

+1

Scalaは単なる別の言語です。 Scalaでシステムを再実装するのに、バックグラウンドで実行するだけで大​​量の時間を費やすのは効率的ではありません。メモリー上の理由から削除する必要がある場合は、ActiveRecordのみを使用し、使用されないビューまたはコントローラー・コンポーネントを使用しないバックグラウンド・ジョブ用の環境を作成することをお勧めします。どのモジュールがロードされているかを非常に選択的にすることができ、メモリフットプリントを劇的に削減できます。 – tadman

2
私はそれのためにbeanstalkdとストーカーラッパー語るこのテーマにライアン・ベイツrailscastをお勧めします

http://railscasts.com/episodes/243-beanstalkd-and-stalker

+0

そしてasciicastsリンク(検索可能):http://asciicasts.com/episodes/243-beanstalkd-and-stalker –

3

DelayedJobやResqueなど、いくつかのオプションがあります。

ResqueはRedisに依存しており、私が常に使用しているソリューションです(非常に満足しています)。

+0

私の経験では、DelayedJobとResque(Redis To Goを使用)の両方がHerokuでうまく動作します。 –

+0

@Steve DelayedJobはHerokuのMongoHQでうまく機能しません。あなたのMongoHQ DBが急速にロックアップされます。それはここに当てはまるとは思っていませんが、頭を上げるように。 –

+0

@Chris HerokuのRDSでDelayedJobを使用していて、かなりうまく動作しています。 –

1

AMQP(RabbitMQ)のようなより重いキューイングシステムを使うことは、ミニオン宝石によって簡単に行えます。同様のbeanstalkdする:

https://github.com/orionz/minion

1

@Blankman、あなたがhttp://www.simpleworker.comをチェックアウトする必要があり、それはこのようなもののために作られたとの負担をとります実行している/スケジュール/あなたのを離れてあなたのプロセスを監視。それは非常に安定しています。