23

外部 Web サービスへの HTTP 呼び出しを行う Ruby on Rails Web サイトがあります。

1 日に約 1 回、サービスの呼び出しが失敗したという SystemExit (以下のスタックトレース) エラー メールを受け取ります。その後、サイトでまったく同じクエリを試してみると、問題なく動作します。サイトが公開されてからずっと発生しており、原因を突き止めることができませんでした.

Ruby はバージョン 1.8.6、レールはバージョン 1.2.6 です。

他の誰かがこの問題を抱えていますか?

これはエラーとスタック トレースです。

SystemExit が発生しました /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in exit' /usr/local/lib/ruby/gems/1.8/gems/ rails-1.2.6/lib/fcgi_handler.rb:116:in exit_now_handler' /usr/local/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/inflector.rb:250:in to_proc ' /usr/local/lib/ruby/1.8/net/protocol.rb:133:in call' /usr/local/lib/ruby/1.8/net/protocol.rb:133:in sysread' /usr/local/ lib/ruby/1.8/net/protocol.rb:133:in rbuf_fill' /usr/local/lib/ruby/1.8/timeout.rb:56:in timeout' /usr/local/lib/ruby/1.8/timeout. rb:76:in timeout' /usr/local/lib/ruby/1.8/net/protocol.rb:132:in rbuf_fill' /usr/local/lib/ruby/1.8/net/protocol.rb:116:in readuntil ' /usr/local/lib/ruby/1.8/net/protocol.rb:126:in readline' /usr/local/lib/ruby/1.8/net/http.rb:2017:in read_status_line' /usr/local/lib/ruby/1.8/net/http.rb:2006:in read_new' /usr/local/lib/ruby/1.8/net/http.rb:1047:in request' /usr/ local/lib/ruby/1.8/net/http.rb:945:in request_get' /usr/local/lib/ruby/1.8/net/http.rb:380:in get_response' /usr/local/lib/ruby/ 1.8/net/http.rb:543:in start' /usr/local/lib/ruby/1.8/net/http.rb:379:in get_response'

4

4 に答える 4

9

Ruby で fcgi を使用すると、非常にバグが多いことが知られています。

ほとんどの人がこの理由でMongrelに移行しており、皆さんにも同じことをお勧めします。

于 2008-08-02T17:50:34.987 に答える
8

FCGI を使用してからしばらく経ちましたが、スレッドの処理に時間がかかりすぎると、FCGI プロセスが SystemExit をスローする可能性があると思います。Web サービスが応答していないか、DNS クエリが遅い可能性があります。一部の Google の結果は、Python と FCGI で同様のエラーを示しているため、mongrel に移行することをお勧めします。 この投稿は、mongrel のセットアップに使用した参考資料であり、今でも参考にしています。

于 2008-08-03T05:22:20.457 に答える
5

私はこれらを Apache1/fastcgi で常に取得していました。Rubyが完了する前にfastcgiがハングアップしたことが原因だと思います。

mongrel への切り替えは最初のステップとしては適切ですが、やるべきことはまだあります。特にRailsから、ライブページのWebサービスから選別するのは悪い考えです。Rails はスレッドセーフではありません。サポートできる同時接続の数は、クラスター内の雑種 (または Passenger プロセス) の数と同じです。

1 つの雑種があり、タイムアウトに 10 秒かかる Web サービスを呼び出すページに誰かがアクセスした場合、その間、Web サイトへのすべての要求がタイムアウトになります。ほとんどのロード バランサーは雑種をやみくもに循環するだけなので、雑種が 2 つある場合は、他のすべての要求がタイムアウトになります。

予測できないほど遅くなる可能性があるものはすべて、ジョブ キューで発生する必要があります。/slow/action への最初のヒットでジョブがキューに追加され、/slow/action はジョブが終了するまで、ページの更新または ajax を介したクエリによって更新を続け、ジョブ キューから結果を取得します。現在、Rails 用のジョブ キューはいくつかありますが、最も古く、おそらく最も広く使用されているのはBackgroundRBです。

アプリの性質にもよりますが、別の方法として、cron を介して N 分ごとにサービスを選別し、データをローカルにキャッシュして、ライブ ページをキャッシュから読み取らせます。

于 2008-08-30T04:55:25.743 に答える
1

乗客も見ていきます。Apache / nginx+Mongrelの従来のソリューションよりもはるかに簡単に実行できます。

于 2008-08-11T16:36:06.327 に答える