8

両端でnode.jsを使用してファイル同期プログラム(Dropboxとは異なります)を構築しています。潜在的に何千ものクライアントが同時にデータを要求する必要があります。

これが私の現在のシステムです:

  • サーバーはWebSocketを介してクライアントに通知をプッシュします(ファイルは更新されています)
  • クライアントはダウンロードをキューに入れ、アイドル時にHTTPリクエストを作成します

たとえば、それぞれ50 MBの圧縮されたチャンクでデータを提供するため、HTTPリクエストのオーバーヘッド(ヘッダー)はごくわずかです。

リクエストとプッシュ通知にWebSocketを使用する場合、次のようになります。

  • 全体的な速度の顕著な改善?(遅延、認証などの削減)
  • 接続を開いたままにするためのサーバーの追加のオーバーヘッド?
  • バイナリデータのプッシュに関する問題?

ダウンロードが行われている間(多くのオーバーヘッド)にサーバーで通知をキューに入れたくないので、専用のWebSocketを介して通知を送信する必要があると思います。

注:これらのWebSocketは、クライアントのシステムがオンになっている限り、長期間開いています。

編集:別のCPUコアに移動するために、別のポートの別のhttpサーバーでWebSocketを使用します。数千(数十万ではないにしても)の同時WebSocketを開く可能性があります...

4

2 に答える 2

5

クライアントとサーバーの両方にnode.jsを使用する場合は、WebSocketではなく純粋なソケットを備えたネイティブネットモジュールを使用する必要があります。純粋なソケットは、データ転送、特にバイナリ用にはるかに最適化されています。私の知る限り、ブラウザのWebSocketはまだバイナリ転送をサポートしていません。

于 2011-04-05T08:36:33.583 に答える
3

私は何か他のものを探していましたが、WebSocketをかなりよく説明しているこの投稿を見つけました:

http://blog.new-bamboo.co.uk/2009/12/7/real-time-online-activity-monitor-example-with-node-js-and-websocket

この記事の非常に興味深い部分は次のとおりです。

Websocketを使用すると、既存のソリューションと比較して大幅に少ないネットワークオーバーヘッドで継続的な通信を行うことができます。

と:

WebSocketとの接続中に、クライアントとサーバーはフレームごとにそれぞれ2バイトのデータを交換します。これに対して、継続的なポーリングを行う場合は8キロバイトのhttpヘッダーが使用されます。

私のユースケース(ブラウザなし)の場合、これは最適なソリューションのようです!ここで、クライアントごとに単一のWebSocketを使用するか、複数のWebSocketを使用するかを決定する必要があります(この時点では、単一のWebSocketに傾いています)。

これが誰かに役立つことを本当に願っています。とりあえずこれは開いたままにしておきます。今週後半にJSカンファレンスに参加する予定です。さらに何かを学んだら、この投稿に追加します。

ブラウザのサポートに関心のある方は、こちらをご覧ください。WebKitはそれをサポートする唯一の信頼できるエンジン(ChromeとSafari)のようです。

于 2011-04-05T05:29:35.817 に答える