2012-04-28 6 views
1

私は1日1回スクリプトを実行する必要があるRailsのウェブサイトを開発しています。スクリプトはxml-feedを読み取り、データベースを更新します。私はRails 3.1.1を使用しており、Herokuでウェブサイトを運営しています。Rails:毎日フィードリーディングスクリプト(1時間)を実行します。提案?

ウェブサイトの実行時にスクリプトが完全に終了しないようにするには、どのようなオプションがありますか?私はそれを解決すると思うdynoを追加するが、特に私はスクリプトを実行するときには本当に外に必要とされていないので、非常に高価です。

別のデータベースでスクリプトを実行してコピーできますか?バックグラウンドで実行しますか?要するに、どのようなオプションがありますか?

編集:私はここではっきりしていませんでした。私の問題は、Webサーバ/データベースにできるだけ影響を与えず、スクリプトを実行しないようにすることです(いつでもなど)。私はできるだけ少ない夜間にスクリプトを実行する予定ですが、その間にウェブサイトが完全にダウンしないようにしています。

+0

gem https: //github.com/javan/whenever。 – afaf12

答えて

2

これは多くの場合、スクリプトのパフォーマンス特性によって決まります。もしCPUが非常に集中していても影響が少ないのであれば、私は心配しないでしょう。herokuスケジューラーのようなものを使うと、ジョブは別々のdynoで実行されます。これは別のダイノーであるため、要求を処理している他のダイノスには影響しません。

重いデータベースの使用はすべて一緒に別のものです。あなたのデータベースにはIO、キャッシュ、CPUなどの有限の量があります。もしあなたがそれを強く押しているのであれば、バストキャッシュ以来多くの読み込みが一般的に悪いですが、他のダイノスのパフォーマンスを低下させる可能性があります。

ウェブサイトの動作を停止することもできます。ジョブが終了してアプリケーションの残りの部分がアクセスしようとしている行/テーブルがロックされた場合、ウェブダイノスはそれらのジョブを解放するまでブロックされますロック。

フィードをトラバースするときに、フィードを解析してDB行を1つずつ更新すると、おそらく大丈夫でしょう:ロック競合の点で大量の書き込み/索引付けされた列から一度に1つの行を読み込み、いくつかのルビ計算を行い、次に1つの行を更新しているように思えるので、難しいと思うでしょう。

パフォーマンスが許容できないほど低下している場合は、ボトルネックが読まれている場合は、片方の読取りスレーブ(レプリカとも呼ばれ、英字ではfollower)を使用します。要約すると、これは、メインのデータベースサーバーを追跡するデータベースサーバーです(これは常に最新です)。このサーバに行うことは、マスタdbに影響を与えることができないため、気にせずにクエリを実行できます。

これは、問題が必要な書き込みの数である場合に役立ちません。ある程度、これは、より繁雑なデータベースサーバーに切り替えることによって(コストをかけて)解決することができます。いくつかの使用パターンでは、異なるタイプのデータストア(例えば、mongo、redis)がリレーショナルデータベースよりも適切な場合があります。場合によっては、パフォーマンスのホットスポットのいくつかを設計することは可能ですが、明らかにそれを考慮するに最適な場所です。

これはすべて非常に抽象的なものです。本当に知っている唯一の方法は試してみることです。アプリのコピーをセットアップしてこのタスクを開始し、パフォーマンスが低下するのを確認してください(または、実際のアプリに対してこれを実行してください)

+0

ありがとう、それは私が探していた "ジェネリック"な答えです。私はさまざまなソースからさまざまな回答を受けました。私はherokuスケジューラを使用すると思いますが、この情報は役に立ちました。 – Christoffer

1

レールのプラグインを確認してください。feedzirraフィード処理をしたいときは非常に便利です。

whenever宝石もチェックアウトしてください。それをインストールし、フィード処理を頻繁に実行するモデルメソッドを作成します。

この方法では、Webサーバーは完全にループしておらず、これは要求の処理に影響しません。しかし、DBは別の話です。

+0

ありがとう、私はこの問題を私の問題に翻訳するのが少し難しいです。これにより、データベースを使用するため、スクリプトが実行されている時間にアクセスしようとするユーザーのために、Webサイトが「ダウン」することになりますか?それとも、おそらくちょうど遅いでしょうか? – Christoffer

+0

サイトはダウンしません。処理しているフィードのサイズと取得しているトラフィックの量によって、遅い要求の点でエンドユーザーがどの程度の影響を受けるかが決まります。 – Faisal

1

宝くじresqueresque-schedulerをお勧めします。私はそれらをプロダクションで使用し、開発とテストは非常に簡単で便利です(resque_spec参照)

私はherokuが赤字を非常にうまくサポートしていることを知っています。そして、あなたは宝石を試すことができますheroku-scheduler。私はそれを使用しませんでしたが、それもクールだと思う;)

Wheneverも素晴らしいです。私は代替案を提案した。それはあなたの選択です

+0

おかげさまで、もう1つの答えと同じように、これを「ユーザーエクスペリエンス」に変換するのは少し難しいと感じています。私がこのソリューションを使用すれば、これは本当に何をするのでしょうか。ウェブサイトを使用している人がいない限り、これらのアクションを実行するのか、それともどのように機能しますか? – Christoffer

関連する問題