【问题标题】:Rails Asynchonous Processing in the Model模型中的 Rails 异步处理
【发布时间】:2011-05-07 01:08:24
【问题描述】:

我的 rails 应用程序有一个简单的模型 Links,它跟踪与更新关联的所有 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 方法是什么?一个“最终确定”函数,其中包含一个事件机器循环,以一次延长/创建所有链接,或者可能在模型中(以某种方式)执行,以便在创建一个异步任务时分拆异步任务?

感谢任何建议/资源

【问题讨论】:

    标签: ruby-on-rails asynchronous io eventmachine


    【解决方案1】:

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

    一旦您安装了delayedjob(gem 安装和迁移),您就可以执行以下操作:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2017-09-30
      相关资源
      最近更新 更多