2011-09-17 17 views
1

私はheroku上にRORアプリを持っています。アプリには8つのオプションのテキストフィールドがあり、ユーザーはそれを入力するか、要件に従って空にすることができます。heroku:herokuにデータを投稿するときにタイムアウトを避ける方法

ユーザーが入力するテキストフィールドが多くなればなるほど、アプリケーションの処理が増えます。 5つ以上のフィールドがいっぱいになると、私のアプリは30秒以上リクエストを処理し、Herokuのタイムアウトを引き起こします。

この問題を解決するソリューションはありますか?

javascriptとajaxを使ってリクエストを2つの部分に分けることができると聞いていますが、タイムアウトの問題を回避できると思います。しかし、私はそれを行う方法がわかりません。

ありがとうございます!

+1

8フィールドのうち5フィールドが入力されたフォームを送信していて、サーバーがタイムアウトしていますか?フォームデータで何をやっているのですか? – Alex

答えて

0

バックグラウンドジョブとして処理するだけで済みます。ヘロクではとても簡単です。 Resque + Redisを使用しますが、DelayedJobを使用することもできます。 Resque(githubによって構築)は、Redis(キーバリューストア)の上にあるキューイングレイヤーです。 DelayedJobを使ってキューイングを行うよりもはるかにスケーリングが簡単ですが、どちらの方法でも動作します。

  1. 最初に、無料のHeroku Redis to Go addonをインストールします。
  2. 次に、Redis To GoのResque with Redis on Heroku blog Postに従って、宝石などを設定してください。

それがセットアップだ後は、ここにあなたがする必要があるすべてです:

  1. は、フォームデータを投稿してください。
  2. 保存する未処理は後で処理します。
  3. キューに何かを追加したことをResqueに伝えます。

フォームは、ユーザー作成フォームの場合、コードは次のようであるかもしれない:

module SaveUser 
    @queue = :save_user 

    def perform(attributes = {}) 
    user = User.create(attributes) 
    user.process! if user && !user.processed_everthing? 
    end 
end 

def create 
    Resque.enqueue(SaveUser, params[:user]) 
end 

...あなたものparams、キューの中だけidを保存する(ない、次のようにそれを書くことができます)

module SaveUser 
    @queue = :save_user 

    def perform(id) 
    user = User.find(id) 
    user.process! if user && !user.processed_everthing? 
    end 
end 

def create 
    user = User.create(params[:user]) 
    Resque.enqueue(SaveUser, user.id) 
end 

すべてをキューイングすると、すぐに次のページに移動します。

ユーザーはすぐに次のページの処理結果を確認する必要がある場合は、しかし、あなただけの何かを把握する必要があるとしています。

+0

ありがとうございました! あなたのアドバイスが参考になると思います。しかし 、私は命令に従い、CMDを実行している間: $すくいresque:作業QUEUE = * いくつかの問題があります。 胡 - ブライアン-のMacBook:ブライアン$すくいresque nextpttは:作業QUEUE = * - トレース レーキが中止! yajl-rubyまたはjson gemをインストールしてください どうすればいいですか? ありがとう! – Brian

1

このようなユーザーの視点からの遅延は認められません。

ResqueまたはDelayedJobを使用して、フォーム処理をワーカーに委任する必要があります。

関連する問題