2011-11-17 17 views
12

私はImpressionistを使ってページの印象を記録しています。データベースの書き出しには約50msしかかかりませんが、ページがレンダリングされてクライアントに送信された後に、実際に書き込むことをお勧めします。Rails 3.1でレンダリングした後にタスクを実行する方法

私はSpawnでフォークしてみましたが、新しいデータベース接続が確立されています。これは、そのような小さな仕事では過度の作業と思われます。遅れた仕事や他のバックグラウンド処理ライブラリはのように見えます。オーバーキルです。データベースへの書き込みを延期するためだけにデータベースに書き込む...勝利ではない。

私はちょうど私ができる希望:

def show 
    render 
    impressionist(@article) 
end 

...と印象派を持っているアクションが既にに戻った直後に、アクションと同じデータベース接続とすべて同じ要求データとそのことを行いますクライアント。もちろん、それはレンダリングメソッドの仕組みではありません。

すべてのソリューションはありますか? Heroku CedarでRails 3.1とRuby 1.9.2を動かす

+4

これはあなたが考えるよりも難しいです:)ここからインスピレーションを得てください:http://www.perfectline.ee/blog/ruby-on-rails-before-render-filter – apneadiving

答えて

0

mongodbのように少し速くログを記録する方法や、ハッシュをredis(超高速)に保存して、1時間ごとにバッチジョブを実行してpostgresデータベースに格納することを検討してください。これらのオプションの両方を使用すると、印象派をハックするか、独自のソリューションをロールバックする必要があります。あなたのバックグラウンドソリューション(delayed_job、resqueなど)で提案したように、プロジェクトのサイズに応じて過剰です。

1

Resqueを正確に使うためにかなり涼しいrailscastがありますが、私が見た他のすべての方法と同様に、フォークにも関係していると確信しています。

6

新しいスレッドを作成します。 Herokuはdynoあたり最大15のスレッドを許可します。

def show 
    render 
    Thread.new do 
    impressionist(@article) 
    end 
end 
+1

要点は、新しい要求。スレッドでは、thread.joinを実行するか、プロセスが終了するとスレッドが終了します。 – jasongarber

1

これは、一緒に来て、有望に見える:https://github.com/brandonhilkert/sucker_punch

ブランドンの固体男。サッカーパンチアウトしようとすることを待つことができません!

+0

サッカーパンチは非常に軽量の宝石です(重い持ち上げはセルロイドで行われます)。それはあなたに管理者のUIまたは何かを与えるわけではありませんが、それが広告していることをします。ほとんどのWebサイトは複数のサーバーを必要としませんが、マルチスレッド+ CoWはVPS環境に便利です。手間のかかるバックグラウンド処理を開始するには良い方法です。 – julian7

0

は、私はあなたが

class ApplicationController < ActionController::Base 

    after_filter :after_filter_cb 

    def after_filter_cb 
    # Some logic 
    end 

end 
1

個人的にafter_filterコールバック関数を使用することができると思い、私はまだで操作されている要素(複数可)に、バックグラウンドスレッドの参照に渡し、その後のアクションから「新しいスレッド」の起動とお勧めしません別のスレッド。そのようなリードは、スレッド間の競合により、非常に迅速に不自然で再現性のないバグになります。

関連する問題