21

Server-Sent Events の原則を正しく理解していれば、クライアントが EventSource に登録するたびに、イベントを管理するリソースへの新しい HTTP 接続が実際に開かれます。他の HTTP 要求とは対照的に、接続は存続するため、このクライアント専用のサーバー プロセス/スレッドは、クライアントが切断されるまで実行され続けます。

SSE を使用して 1000 のクライアントがアプリケーションに接続されている場合はどうなるでしょうか? SSE を処理するためだけに、1000 個のプロセス/スレッド (同じことを行う) を同時に実行することになるでしょうか? 私は間違っていると思いますが、そうでない場合、少なくともサーバーが多くのプロセス/スレッドを同時に実行する必要がない通常の AJAX ポーリング方法よりも本当に効率的ですか?

4

2 に答える 2

23

はい、各クライアントは可能な限り接続を開いたままにします。1000 人の同時ユーザーの場合、1000 の TCP/IP 接続が開かれます。

ただし、各接続がスレッドを使用するかどうかは、サーバーによって異なります。

Apache は通常、接続ごとにスレッドを実行し続けるため、かなりコストがかかります。Apache では、KeepAlive を無効にしてポーリングを使用するのが最善です。

node.js のようなイベントベースのサーバーを使用する OTOH では、すべての接続を管理するプロセスを 1 つだけ持つことができるため、各接続のコストがはるかに低くなり、何千もの接続を簡単に開いておくことができるはずです。

SSE の優れた点は、ポーリングにも使用できることです。retry:再接続 (ポーリング) する前にクライアントが待機する時間を指定するディレクティブがあります。ポーリングが必要な場合は、それを送信して接続を閉じるだけです。

于 2013-01-09T00:36:46.950 に答える
13

これは、サーバーのスレッド モデルによって異なります。 Apacheはデフォルトで接続ごとに 1 つのスレッド (またはプロセス) を使用するため、スレッドがあまり機能していなくても (SSE 接続で予想されるように)、リソースを使い果たします。

Nginxのようなサーバーのモデルはわずかに異なり、各スレッドは複数のリクエストを非同期で処理します。そのため、SSE や WebSockets などの方がはるかに効率的です。

Apache は、Nginxや同様のサーバーのように動作するように作成できます。

于 2013-01-09T00:38:14.450 に答える