0

我的 rails 应用程序有一个简单的模型链接,它跟踪与更新关联的所有 Url。

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 函数非常幼稚(仍在开发,所以它应该是:)),并且由于它在请求期间阻塞而造成了相当大的瓶颈,如果一次创建相当多的更新可能会很长一段时间,通常会创建几十个。由于更新/链接等需要快速显示给用户,这是一个问题。

    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 还是比较陌生。对于这样的事情,最好的 Rails 方法是什么?一个“最终确定”功能,其中包括一个事件机器循环,以一次延长/创建所有链接,或者可能在模型中(以某种方式)执行,以便在创建一个异步任务时分拆异步任务?

感谢您的任何建议/资源

4

1 回答 1

1

有几个后台处理框架(delayedjob、stalker、resque 等).... 可以说是使用 Delayed Job 最容易上手的。

一旦你安装了延迟作业(gem install 加上一个迁移),那么你可以执行以下操作:

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

于 2011-05-07T12:22:16.300 回答