2011-05-07 104 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