25

まず、SPDY と Websockets は同じものではなく、HTTP などと同じように SPDY で Websocket を実行できることを理解しています。

ただし、サーバープッシュ(同じ接続を介した双方向呼び出し)もサポートするREST(のような)APIを提供しようとしている場合、SPDYがWebソケットの実行可能な代替品になるかどうか疑問に思っています。

私の現在のプロトタイプは websockets (node+socket.io) を使用しており、正常に動作します。ただし、websockets に関する私の問題は、サーバーとの間で要求をルーティングするための独自の JSON プロトコルを作成する必要があることです。私はむしろ、REST ベースのアーキテクチャにより適した REST スタイルの URI とヘッダーをリクエストで使用したいと考えています。SPDY は、これをより適切にサポートするようです。

また、ヘッダーがないため、websocket が展開ネットワークにうまく適合しないのではないかと心配しており、SPDY が再び適合すると考えています。

ただし、ブラウザにファイルをプッシュする以外に、双方向の SPDY リクエストの例はあまり見たことがありません。次のようなイベントとデータをブラウザにプッシュしたいと思います。

Content-Type: application/json
{
   "id": "ca823f3e233233",
   "name": "Greg Brady"
}

しかし、WebSocket および socket.io API の場合のように、ブラウザー/Javascript がどのように「リッスン」してこれらに反応するかは明確ではありません。

4

3 に答える 3

37

最初から始めましょう: HTTP アップグレードを行うのではなく、なぜ SPDY で WebSockets を実行したいのでしょうか? HTTP 接続を WS にアップグレードすると、その TCP ストリームを使用できなくなります。WS 接続はアイドル状態になる可能性がありますが、それでも接続はブロックされます。SPDY を使用すると、同じ基礎となる TCP ストリームを介して、複数の要求/応答、および websocket 接続 (または複数) を多重化できます。実際には、2012 年 7 月の時点で、WS over SPDY はまだ進行中の作業であるため、WebSocket に SPDY を使用するにはしばらく待つ必要があります。

しかし、サポートがあるとしましょう... JavaScript から "SPDY Push" をリッスンする方法が明確でない理由は、それを行う方法がないからです! プッシュされたリソースはブラウザのキャッシュに入ります - それ以上でもそれ以下でもありません。データを JavaScript コールバックにストリーミングする必要がある場合は、WebSocket または Server-Sent Events (SSE) が答えです。

したがって、すべてをまとめると、次のようになります。

  • HTTP は、個々の小さなリクエスト (ヘッダーなど) に多くのオーバーヘッドを追加します
  • WebSockets は低オーバーヘッド チャネルを提供しますが、独自のルーティングを実装する必要があります
  • SPDY は、小さな HTTP リクエストのオーバーヘッドとコストを大幅に削減します (win)
  • SSE は、データをクライアントにプッシュするための優れた単純な代替手段です (現在、SPDY 経由で動作します)。

SPDY+SSE を使用して目標を達成でき、そのすべての通信を同じ TCP チャネルで実行できます。サーバーへの SPDY リクエスト、サーバーからの SSE プッシュ。

于 2012-08-24T06:08:19.177 に答える
6

最初にいくつかの説明:

  • 基本 WebSocket プロトコル (IETF 6455) は階層化されontoた HTTP ではありません。WebSocket 接続の最初のハンドシェイクは HTTP 互換ですが、ハンドシェイクが完了すると、プロトコルはフレーム化された双方向の全二重接続になり、オーバーヘッドが非常に低くなります (多くの場合、ヘッダーのフレームあたりわずか 2 バイト)。

  • WebSocket over SPDY のアイデアは、日の目を見るかもしれないし、見ないかもしれない提案です。この場合、WebSocket は実際には SPDY 上に階層化されています。SPDY と HTTP の性質により、最初の接続/ハンドシェイクが高速になる場合がありますが、WebSocket ヘッダー フィールドが SPDY ヘッダー フィールドにマップされるため、データ フレームのオーバーヘッドが大きくなります。

SPDY は、HTTP をより効率的に置き換えることを目指しています。WebSocket は、クライアントとサーバー間で非常に低遅延の双方向/全二重メッセージングを可能にする、まったく異なる獣です。

シンプルな API を使用したサーバー プッシュに関心があり、超低レイテンシーは必要ない場合は、シンプルで WebSocket API に似た API を持つサーバー送信イベントを検討できます。または、サーバープッシュを有効にするが、上記のソリューションとは異なり、古いブラウザーをより適切にサポートする多くの優れた Comet ライブラリの 1 つを調べることができます。

于 2012-08-24T14:41:36.343 に答える
0

ただし、websockets に関する私の問題は、サーバーとの間で要求をルーティングするための独自の JSON プロトコルを作成する必要があることです。

私はネットワーク呼び出しを promise でラップする socket.io 上に薄い RPC レイヤーを書きました。こちらでご覧いただけます。

于 2013-10-16T14:48:31.760 に答える