2011-11-17 68 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哈希(超快速),並有一個批處理作業運行每隔一小時左右到這些存儲在你的Postgres數據庫。有了這兩個選項,你將不得不破解印象派,或滾你自己的解決方案爲您提供解決方案的背景(delayed_job的,resque等)的建議可能是矯枉過正,這取決於你的項目的尺寸。

1

有使用Resque正是這種一個很酷railscast,但我敢肯定它也涉及分叉,像所有其他的方法我都看到了。

6

產生一個新的線程。 Heroku將允許每個測功機多達15個線程。

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

問題是,我希望這個過程可用於一個新的請求。使用線程,您必須執行thread.join,否​​則當進程終止時,線程終止。 – jasongarber

1

這走過來看起來很有希望:https://github.com/brandonhilkert/sucker_punch

布蘭登了堅實的花花公子。迫不及待想嘗試Sucker Punch!

+0

吸盤衝牀是一個非常輕量級的寶石(在賽璐珞完成繁重的工作),易於打理。它不會給你一個管理用戶界面或任何東西,但它做它的廣告。大多數網站不需要多個服務器,但多線程+ CoW在VPS環境中非常方便。這是一個很好的方式來開始後臺處理,沒有麻煩。 – julian7

0

我認爲你可以使用after_filter回調函數

class ApplicationController < ActionController::Base 

    after_filter :after_filter_cb 

    def after_filter_cb 
    # Some logic 
    end 

end 
1

就個人而言,我不建議推出「新牙」的動作,然後通入後臺線程參考其仍然是在操縱元素(S)另一個線程。由於線程之間的衝突,這種情況很快就會導致令人討厭的不可重現錯誤。