私は、特定のイベントをキューに書き込むレール3アプリケーションを持っています。キューイベントに反応するRubyの長時間実行プロセス
サーバー上で、x秒ごとにキューをポーリングし、スケジュールに基づいて他のタスクを実行するサービスを作成したいとします。
ルビースクリプトを作成してcronジョブで実行する以外に、安定した代替手段がありますか?
私は、特定のイベントをキューに書き込むレール3アプリケーションを持っています。キューイベントに反応するRubyの長時間実行プロセス
サーバー上で、x秒ごとにキューをポーリングし、スケジュールに基づいて他のタスクを実行するサービスを作成したいとします。
ルビースクリプトを作成してcronジョブで実行する以外に、安定した代替手段がありますか?
永続的な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ヒットとメモリヒットとの間のトレードオフです。
:
そしてasciicastsリンク(検索可能):http://asciicasts.com/episodes/243-beanstalkd-and-stalker –
DelayedJobやResqueなど、いくつかのオプションがあります。
ResqueはRedisに依存しており、私が常に使用しているソリューションです(非常に満足しています)。
私の経験では、DelayedJobとResque(Redis To Goを使用)の両方がHerokuでうまく動作します。 –
@Steve DelayedJobはHerokuのMongoHQでうまく機能しません。あなたのMongoHQ DBが急速にロックアップされます。それはここに当てはまるとは思っていませんが、頭を上げるように。 –
@Chris HerokuのRDSでDelayedJobを使用していて、かなりうまく動作しています。 –
AMQP(RabbitMQ)のようなより重いキューイングシステムを使うことは、ミニオン宝石によって簡単に行えます。同様のbeanstalkdする:
@Blankman、あなたがhttp://www.simpleworker.comをチェックアウトする必要があり、それはこのようなもののために作られたとの負担をとります実行している/スケジュール/あなたのを離れてあなたのプロセスを監視。それは非常に安定しています。
多分スカラーの何かがより効果的でしょうか? – Blankman
Scalaは単なる別の言語です。 Scalaでシステムを再実装するのに、バックグラウンドで実行するだけで大量の時間を費やすのは効率的ではありません。メモリー上の理由から削除する必要がある場合は、ActiveRecordのみを使用し、使用されないビューまたはコントローラー・コンポーネントを使用しないバックグラウンド・ジョブ用の環境を作成することをお勧めします。どのモジュールがロードされているかを非常に選択的にすることができ、メモリフットプリントを劇的に削減できます。 – tadman