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には比較的慣れていません。このようなものに最適なレールアプローチは何でしょうか?一度にすべてのリンクを延長/作成するイベントマシンループを含む「finalize」関数、またはモデル内で(何らかの方法で)実行して、作成されるたびに非同期タスクをスピンオフするようにしますか?

アドバイス/リソースをありがとう

4

1 に答える 1

1

いくつかのバックグラウンド処理フレームワーク(delayedjob、stalker、resqueなど)があります。...DelayedJobを使い始めるのがおそらく最も簡単です。

delayjobをインストールしたら(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

于 2011-05-07T12:22:16.300 に答える