2013-01-08 29 views
16

サーバー送信イベントの原則を正しく理解すると、クライアントがEventSourceに登録するたびに、イベントを管理するリソースへの新しいHTTP接続が実際に開かれます。他のHTTPリクエストとは異なり、この接続は有効なままなので、このクライアント専用のサーバプロセス/スレッドは、クライアントが切断するまで実行を継続します。サーバー側のサーバー送信イベントコスト

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

+5

ApacheのようなWebサーバーでは、かなりのリソースを必要とします。しかし、それがnode.jsのような非同期Webサーバがある理由です... – ThiefMaster

答えて

17

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

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

通常、Apacheは接続ごとにスレッドを実行しているので、かなり高価です。 Apacheでは、KeepAliveを無効にしてポーリングを使用することをお勧めします。

OTOHのようなイベントベースのサーバーでは、すべての接続を管理するプロセスが1つしかないので、各接続のコストが大幅に低下し、数千の接続を簡単に開くことができるはずです。

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

+6

あなたの答えをありがとう。 基本的に、アプリケーションでSSEを使用する予定であり、かなりの数のクライアントが必要な場合は、イベント駆動型Webサーバーを使用する必要があります。 これは私が読んだSSEに関する記事では欠落していた重要なポイントです。 – ouno

11

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

Nginxのようなサーバーのモデルは少し異なります。各スレッドは、複数の要求を非同期に処理します。 SSEやWebSocketsのようなものはずっと効率的です。

Apacheはperform more like Nginxと同様のサーバーにすることができます。

関連する問題