2012-05-09 14 views
0

私は、作成されると、定期的に一連のFTPサーバーから自動的にデータをスクラップするライブラリを持っています。それはスレッド化されており、単に結果のメソッドを呼び出してこれまでの結果を見ることができます。私は非常に新しいレールですが、私はこのオブジェクトのためのWebインターフェイスを作成して、結果を見たり、開始したり、停止したり、基本的にオブジェクトと一般に対話することを許可しました。私はそれがバックグラウンドで実行し、データを収集できるように誰もがWebインターフェイスを使用しているかどうかにかかわらず、最初に作成され、元のままにしたい。私はまた、コントローラからアクセスできるようにして、開始/停止/情報ページを持つことができます。これを達成するための最善の方法に関するアイデアはありますか?Railsでグローバルオブジェクトを自動的に作成する

P.S.私はRailsの3.2.3とRuby 1.9.3

+0

などのストレージオプションは、データベース、リモートストレージ(s3)、ファイルシステム(ローカル)、およびメモリのように見えます。これらのうち、必要なのはどれですか? –

+0

保管には赤を使用してください。 –

答えて

2

バックグラウンド・プロセスを実行して、レールのアプリからアクセスするためのより良い方法がありますを実行していますが、直接あなたの質問に答えるために:

ちょうどイニシャライザに入れます。/config/initializersディレクトリがあります。そこに.rbファイルを置くと、あなたのレールアプリが起動されると自動的に実行されます。

/config/initializers/hello.rb:ちょうど地球を作成し、あなたのクラスのインスタンスをグローバルに利用できるようにするには

Rails.logger.debug "Hello World" 
があなたのレールのサーバを起動

、あなたが表示されます「Hello World」のvar:

MYCLASS = MyClass.new 
+0

ありがとうございます。私は必要に応じてRedisに変換しますが、このWebアプリケーションはほとんど使用されず、ファイアウォールの背後にあるので、セキュリティとスケーリングはあまり問題になりません。タッドマンの言うことが真実で、複数のインスタンスが開始されたら、より洗練されたソリューションを探す必要がありますが、直接的に感謝します。 – hololeap

+0

Railsのインスタンスが複数実行されているとどうなりますか?複数のプロセスに陥ることはありませんか?しかし、他の方法で提案したように、 '/etc/init.d/MyThing start'のような他の手段でプロセスを開始するようにコードを呼んでいれば、これは問題ありません。 – David

0

Railsアプリケーション内にスレッドを作成しないでください。これは面倒で危険で、Railsは単なるプロセスではなく、あなたのランチャーフレームワーク(Passengerなど)によって作成された数多くのものであるため、各プロセスでこのオブジェクトのインスタンスを作成する必要があります。

より良い方法は、バックグラウンドで実行されるが、さまざまなRailsインスタンスで使用できるAPIを公開する特異なプロセスを用意することです。これを行う1つの方法は、Memcached、Redis、従来のデータベース、またはフラットファイルなどのシステムを共有ストレージシステムとして使用することです。もう1つの方法は、Railsで使用できるインタフェースを公開してAPI呼び出しに直接応答する方法です。 「memcachedを話す」プロセスを作るのはあまり難しくありません。

一般的に最も簡単なアプローチは、共有ストレージを使用してジョブを完了させることです。使い方が簡単で、プロセスが正しい結果を出しているかどうかを調べるのがさらに簡単です。たとえば、ActiveRecordを使用してスクレイピングの結果をデータベースに保存し、これらの同じモデルを使用してアプリケーション内でデータをフェッチします。

Railsアプリケーションには、この共有データにアクセスするための何らかのラッパーが組み込まれています。これは一連のActiveRecordモデル、いくつかのMemcached呼び出し、または何か他のものかもしれませんが、最終結果はN個のプロセスで独立して実行できるきれいなインターフェースになります。

0

Hmm。これはLinuxのボックスで実行されていますか?

もしそうなら、システム起動時にデーモン&を起動させることもできます。私はデータ&を、おそらくメモリストア(Memcache?Redis)やデータベースに現在の状態(実行中/停止中)を入れます。あなたのコントローラはそこからデータにアクセスします。

コントローラには、/etc/init.d/my_service stop/start/restartのようなものを直接行うこともできます。

これらの小さなデーモンをさまざまなマシンで実行している(または管理している)場合は、&とRabbitMQなどで通信するアプリを作成することをおすすめします。あなたがしたいことを過度にする

0

RedisとResqueはあなたの望むものです。あなたのレールアプリと共に。

のRedis:http://redis.io/

Resque:https://github.com/defunkt/resque

Redisのキャッシュサーバとresqueはそれの上に構築されたジョブスケジューリングツールです。 Resqueには、その動作をカスタマイズしたり拡張したりできる拡張機能がたくさんあります。たとえば:

  • https://github.com/quirkey/resque-status - Resqueステータス

  • https://github.com/bvandenbos/resque-scheduler Resqueスケジューラ(対話形式で昼食の仕事にあなたをできるように、または上の起動ジョブ(あなたは、彼らが実行中のジョブを実行しているから進捗や情報を監視することができ)

  • https://github.com/jayniz/resque-loner)定期的、クーロンのようなスケジュール - Resque一匹狼(あなたが仕事のインスタンスが1つだけの時間に実行するためにキューに入れられていることを確認することができます)

Resqueには、すべてのジョブとキューのステータスを追跡できるWeb UIが付属しています。

私は基本的に、あなたがジョブを起動するか、または実行中のジョブの完了や進行状況を監視するためのページを作成してアプリケーションを構築します。

あなたのすべての仕事は「ワーカー」サーバー上で実行され、レールアプリの状況には関係ありません。すべての進捗データは赤色で保存されるので、もしあなたのレールアプリが再起動すれば、再起動して現在のデータがあるときに赤色に接続するだけです。

これらのインフラストラクチャはすべて、Herokuでは「Redis-to-Go」アドオンを使用して本当にうまく機能します。私は現在、多くのタスクにそれを使用し、素晴らしい作品です。

関連する問題