0

Rails アプリケーションで ajax リクエストを行う必要があります。この ajax リクエストは、いくつかのサーバーに対して他の多くの http リクエストを作成する必要があります。それら(リクエスト)がたくさんあるかもしれません。

def ajax_request
  # request to the server1....
  # request to the server2....
  # request to the server3....
  # request to the server4....
  respond_to {|format| format.js }
end

問題はもちろん、時間がかかることです。各リクエストは、ページに表示できるデータの独立した部分を返し、他のリクエストに依存しないことに注意してください。

私がやりたいのは、このようにデータを部分的に返すことです

def ajax_request
  # request to the server1....
  respond_to {|format| format.js }

  # request to the server2....
  respond_to {|format| format.js }


  # request to the server3....
  respond_to {|format| format.js }


  # request to the server4....
  respond_to {|format| format.js }
end

それが機能しないことはわかっていますが、前述の方法で機能するコードを探しています。あなたは私に何を勧めますか?

別のオプションは、多くの ajax リクエストを送信することです

def ajax_request1
  # request to the server1....
  respond_to {|format| format.js }
end

def ajax_request2
  # request to the server2....
  respond_to {|format| format.js }
end

def ajax_request3
  # request to the server3....
  respond_to {|format| format.js }
end

サーバーのパフォーマンスが低下する可能性がありますね。

あなたの考え?

4

2 に答える 2

1

これは、キャッシュ サーバーとバックグラウンド処理ワーカーを使用するアイデアです。たとえば、キャッシングに Redis、バックグラウンド処理に Resque を使用するとしますが、memcached と backburner (beanstalkd) など、機能を提供するものを使用することもできます。

最初のリクエストが届いたら、リクエストの一意の ID (おそらく GUID) を作成し、それを JSON レスポンスとしてクライアントに返します。結果を保持するために GUID をキャッシュ キーとして (おそらく有効期限付きで) 使用し、データを要求する必要があるサーバーごとに 1 つのバックグラウンド タスクを作成します。これらのバックグラウンド タスクには、すべての要求パラメーターとキャッシュ キーの GUID を含める必要があります。

resque ワーカーは、これらのタスクをキューからプルし、リクエストを実行し、レスポンスを JSON として redis/memcached キャッシュ ストアに入れることができます。十分な数のワーカーがあれば、すべてを並列化できます。そうでない場合は、最終的にすべてが完了するでしょう。FIFO です。一方、最初のクライアントはロング ポーリングを使用して、1 ~ 2 秒ごとに新しい結果を要求できます。結果が見つからないか、1 つの新しい結果が見つかるか、複数の結果が見つかる場合があります。どの結果が既に表示されているか、いつすべての結果が得られたかを追跡する必要があるだけです。このようにして、ユーザーはより多くの情報が戻ってくるのを徐々に見ることができ、パーセンテージや「4 / 20 完全」タイプの情報を表示することもできます。

于 2013-03-28T13:44:27.097 に答える
1

3 つの速い応答は、1 つの長い応答よりも優れています。これがページネーションの理由の 1 つです。

リクエストごとに 1 つのレスポンスしか持つことができません。Rails 4 はサーバー送信イベントをサポートしていますが、これは少し変更されますが、希望どおりになる可能性は低いです。

1 つではなく大量のリクエストがある場合、それは実際にはバランスになりますが、1 つのリクエストを 2 つまたは 3 つに分割している場合、それは素晴らしいことであり、実際にはパフォーマンスが向上する可能性があります。

大量のリクエストの場合、複数のレスポンスを取得する代わりに、データを ivars に保存して、それをビューに渡して処理する必要があります。

ここでブロッキング I/O を行っていない場合は、これらを個別のスレッドに分割して応答時間を改善することもできます...そして、ブロッキング I/O を行っていて、これらのタイプのリクエストが多く予想される場合は、おそらくMRI の代わりに実際のスレッド (JRuby または Rubinius) を実行する Ruby 実装の使用を検討することをお勧めします。

于 2013-03-28T12:02:56.550 に答える