2

Unicorn(2人のワーカー)とnginxで実行するRailsアプリがあります。単一のリクエストの処理に1〜20秒かかるサードパーティのAPIを統合したいと考えています。そのサービスにプロキシする新しいコントローラーを作成するだけでは、アプリ全体が影響を受けます。これは、APIを介してそのサービスにリクエストを送信するのに2人しかかからず、残りのユーザーは残りのユーザーにアクセスできないためです。アプリ。

私たちは2つの解決策を考えています。

  1. サードパーティAPIへのすべてのリクエストを実行する別のnode.jsサーバーを作成します。この場合、認証/承認にRailsのみを使用し、X-Accel-Redirectヘッダーを使用してnginx経由でノードにリクエストをリダイレクトします(ここで説明されているようにhttp://blog.bitbucket.org/2012/08/24/分離サービス/
  2. ユニコーンをシンまたはレインボーに置き換えてください!そして、Railsアプリでプロキシを維持します。これにより、おそらく、より多くの同時接続を処理できるようになります。

どの解決策が良いでしょうか?または、他に何かできることはありますか。

個人的には、ノードの偶数ループがここでの作業に適していると感じています。オプション2では、まだ多くのスレッドをブロックしてHTTPリクエストが完了するのを待っているためです。オプション1では、遅いのを待っている間に、より多くのリクエストを実行できます。終了するもの。

ありがとう!

4

2 に答える 2

1

X-Accel-Redirectしばらくの間、このソリューションを本番環境で使用してきましたが、うまく機能しています。

サーバーの下のnginx構成には、外部サービスのエントリがあります(この場合はnode.jsで記述されています)。

server {
  ...
  location ^~ /some-service {
    internal;
    rewrite ^/some-service/(.*)$ /$1 break;
    proxy_pass http://location-of-some-service:5000;
  }
}

レールでは、リクエストを認証および承認し、それを他のサービスに渡したい場合は、コントローラーで次のようにします

headers['X-Accel-Redirect'] = '/some-service'
render :nothing => true

これで、Rails はリクエストの処理を完了し、それを nginx に返します。Nginx はx-accel-redirectヘッダーを/some-service確認し、node.js サービスにプロキシするように構成した新しい URL へのリクエストをリプレイします。node.js+nginx がまだ元のリクエストを処理している場合でも、Unicorn と Rails は新しいリクエストを処理できるようになりました。

このように、Rails をアプリケーションのメイン エントリ ポイントおよびゲートキーパーとして使用しています。ここで認証と承認が行われます。しかし、より適切な場合には、多くの機能をこれらのより小さなスタンドアロンの node.js サービスに移動することができました。

于 2014-03-31T11:07:56.337 に答える
0

既存の Rails アプリで使用できるためEventMachine、書き換えが大幅に少なくなります。net/httpAPI に対してリクエストを行う代わりに、API に対してEM::HttpRequestリクエストを行い、コールバックを追加します。これは node.js オプションに似ていますが、特別なサーバー IMO は必要ありません。

于 2013-01-14T15:37:32.017 に答える