Rails异步处理模型
问题描述:
我的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”函数,包括一个事件机器循环来一次延长/创建所有链接,或者可能在模型中做某事(以某种方式),以便在创建时创建一个异步任务。
感谢您的任何意见/有资源
答
有一对夫妇的背景处理框架(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