2011-05-07 125 views
0

我的Rails應用程序有一個簡單的模型鏈接跟蹤所有與更新相關的Url。Rails異步處理模型

class Link 
include Mongoid::Document 
include Mongoid::Timestamps 

field :url, type: String 
field :domain, type: String 
attr_accessible :url, :domain 

validates_uniqueness_of :url 

has_and_belongs_to_many :updates 

before_create :longenate 

但在此之前我創建的對象,我想擺脫任何URL縮短的,由於種種原因鏈接一樣長壽,和整體只是不順心縮短服務。

目前我的longenate功能非常天真(仍然是deving,所以它應該是:)),並且創建了一個相當的瓶頸,因爲它在請求期間阻塞了,如果創建了很多更新,這可能是相當長的一段時間一次,通常是幾十個被創建。由於更新/鏈接等需要快速顯示給用戶,這是一個問題。

http_client = HTTPClient.new(:agent_name => "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)") 
begin 
    head_res = http_client.head(url) 
    unless head_res.header['Location'].empty? 
     short_url = url 
     self.url = head_res.header['Location'][0]  
    end 
rescue Exception => e 
    self.domain = "ERROR ACCESSING URI" 
    self.url = "Error Accessing URI, site down/non existant?" 
end 

我想換了這一點的東西非阻塞。我熟悉eventmachine,並用它來創建一些簡單的服務和消費者,但對於rails還是比較新的。對於這樣的事情,最好的鋼軌方法是什麼?一個「finalize」函數,包括一個事件機器循環來一次延長/創建所有鏈接,或者可能在模型中做某事(以某種方式),以便在創建時創建一個異步任務。

感謝您的任何意見/有資源

回答

1

有一對夫婦的背景處理框架(delayedjob,死纏爛打,resque等)......可以說上手與延遲工作最容易的。

一旦你安裝了delayedjob(創業板安裝加遷移),那麼你可以做這樣的事情:

class Link 
    .. 
    before_create :longenate 
    def longenate 
    # do your stuff 
    self.save 
    end 
    handle_asychronously :longenate 
end 

然後,你必須做的工人使用rake jobs:work他們的工作。這將發生在後臺;在這個實現中,你將會保存那些沒有被激活的記錄,所以你可能需要一個'狀態'字段來指明它是否已經變得孤立。

更多信息:http://www.therailsway.com/2009/7/22/do-it-later-with-delayed-job