2012-01-21 7 views
2

私はdiscogs-wrapper gemを使用して音楽情報にアクセスしていますが、APIリクエスト中にサーバが静止しています。私は実際の要求は、私が関数Discogs::Artist.find_by_name nameを呼び出すと、宝石の次の部分でトリガーされると信じています。外部のAPI応答を待っている間にサーバがすべてのリクエストをハングアップ

Net::HTTP.new(uri.host).start do |http| 
    http.request(request) 
end 

二つの異なるブラウザ(ChromeとFirefoxの)における2つの要求のログに従い、私が最初のアーティスト「ピンク・フロイド」の検索を実行し、他のブラウザにルートページをリフレッシュし、この最後の単純な要求これは通常、要求が持続する間、API要求の間にミリ秒かかる。

Started GET "/artists/show?utf8=%E2%9C%93&artist_name=pink+floyd&commit=search" for 127.0.0.1 at 2012-01-21 18:03:52 +0000 
Processing by ArtistsController#show as HTML 
    Parameters: {"utf8"=>"✓", "artist_name"=>"pink floyd", "commit"=>"search"} 
get_artist(pink floyd) 
get_artist(pink floyd) - ended in 26394ms 
    Rendered artists/_search_form.html.haml (4.3ms) 
    Rendered discogs/artist/releases/_release.html.haml (606.5ms) 
    Rendered artists/show.html.haml within layouts/application (1876.4ms) 
Completed 200 OK in 28303ms (Views: 1907.8ms | ActiveRecord: 0.0ms) 


Started GET "/" for 127.0.0.1 at 2012-01-21 18:04:20 +0000 
Processing by ApplicationController#show as HTML 
    Rendered artists/_search_form.html.haml (4.5ms) 
    Rendered application/show.html.haml within layouts/application (6.5ms) 
Completed 200 OK in 23ms (Views: 22.0ms | ActiveRecord: 0.0ms) 

は、どのように私は、サーバーが30秒よりもさらにを取ることができる応答を無駄にハングアップすることを避けることができますか? - thanks

答えて

3

このようにハングアップする可能性のある要求/応答サイクルでは何もしたくないです。理想的には、Railsアプリケーションのすべてのアクションができるだけ早く返されるべきです。

この問題の一般的な解決方法は、長期実行コードを別のバックグラウンドジョブプロセスに移動することです。私は単一のレールプロセスで複数のスレッドをフォークするか実行するようなことはしません。私はこの時点で推薦

2つの人気のバックグラウンド処理ソリューションは、以下のとおりです。

他のソリューションバックグラウンドジョブのソリューションが存在するが、これらの2つの最も人気のあるものです、IMO。

バックグラウンドジョブが完了したことをユーザーにフィードバックするには、いくつかのオプションがあります。

  • AJAXを使用してサーバーをポーリングし、ジョブがいつ完了したかを確認します。 resqueの場合、これを達成するのに役立つプラグインがいくつかあります:https://github.com/quirkey/resque-statusまたはhttps://github.com/idris/resque-progressなどです。仕事が比較的早く終わるなら、これは簡単で適切だと思います。また、私はあまりにも頻繁にajax呼び出しを行うことはありません。あなたのサーバーの応答時間と負荷に依存しますが、私はそれを2〜2回以上繰り返さないでしょう。サーバーの速度が遅いか負荷が高い場合、このポーリングは悪化させます。

  • プッシュ技術を使用してください。私はJuggernautが使い方が簡単であることを発見しました。ジョブが完了したら、メッセージをクライアントにプッシュします。しかし、これをサポートするインフラストラクチャはかなり複雑です。しかし、それはレールのサーバからのポーリングの負荷を削除し、技術をプッシュし、他のクールなもののすべての種類を実装するために使用することができます:)

1

これは、デフォルトではどのようにrailsが動作するかを示しています。各アプリケーションインスタンスは、一度に1つの要求を処理します。あなたはマルチスレッドモード(config.threadsafe!)を有効にすることができます。シンはそれで正常に動作するはずです

+0

これが動作しているようですし、それは、コードの非常にシンプルなラインですが、私はよ私がどのような問題に遭遇できるかを知るためにいくつかのものを読んでいます(これは原子的なものではありません)。ここでは、アプリケーション全体に影響を与える何かを実装しています。 – ecoologic

+0

requireの非スレッド安全性は、起動時にレールがオンになっているときにすべてのアプリケーションをロードする理由です。レールそのものはスレッドセーフですが、スレッドセーフは一般的に扱いにくいビジネスです。何らかのグローバルな状態を操作しているときはいつでもスレッドセーフであるかどうかを尋ねます。ミューテックスをガードするか、実際にはスレッドのグローバルステートにするかどうかを尋ねます。 –

関連する問題