2017-02-20 9 views
1

http2を使用して、ノードからブラウザに応答をストリーミングすることはできますか?http2を使用してブラウザに応答をストリーミングできますか?

Webアプリケーションでは、ユーザーがサーバープロセスを開始するボタンを押します。このプロセスは完了するまでに10分以上かかることがあります。ステータスの更新をクライアント/ブラウザにストリームし直したい。

私はWebSocketでこれを行うことができると信じていますが、http2にはこれを簡単にするための準備ができていたと思います。私はそれが "プッシュ"をサポートしていることを知っていますが、私が知る限り、それはユーザーが将来必要とするかもしれないファイルをプッシュするためだけです。

また、http2も必要ないかもしれませんか?ブラウザは接続をどのくらい開いていますか? res.write()を無期限に保つことができますか?

+1

[SSE](https://en.wikipedia.org/wiki/Server-sent_events)を使用することができます。私はHTTP/2対HTTP/1.1がここでは関連しているとは思わない。 – kennytm

+0

@kennytmおっと、それは有望です。ありがとう! – mpen

答えて

2

原則として、レスポンス本文内のデータの断片のみを送信することで、任意のHTTPバージョンでサーバーからクライアントにデータをストリーミングできます。しかし、現在のブラウザーのHTTP API(XHRとフェッチ)では、レスポンス本体をストリーミング形式で読み込むことはまだできません。代わりに、応答全体をバッファーにします(無限ストリームには意味がありません)。 https://www.chromestatus.com/feature/5804334163951616既にChromeで使用することはできますが、私が理解している限り、完全に標準化されておらず、まだ広く利用可能ではありません。

この一般的なルールの例外は、よく定義されたトランスフォームエンコーディング(text/event-stream)に続くブラウザからのHTTP応答であるServer Sent Events(SSE)です。ブラウザーはSSE応答を処理するためにSSE APIをサポートし、SSE APIを使用すると、受信した各データチャンクに対してイベントを取得することができます。 APIは非常に簡単で、独自のチャンクメカニズムを開発する必要はないため、アプリケーションに適したオプションです。

HTTP/1.1とHTTP/2に関して:あなたがそれを使って作成できる並行ストリームの数に大きな違いがあります。 HTTP/1.1の場合、各ストリームは完全なTCP接続を必要とし、ブラウザはリモートホストへの接続を制限します(私は10未満と思う)。したがって、SSEストリームを50個作成することは不可能です。さらに進んで、SSEストリームを1つだけ使用し、その中にすべてのイベントデータを入れてください。一方、HTTP/2では、単一のTCP接続で多数のHTTP要求を多重化することができます(これによりストリーミングされた本体応答も)。これにより、より多くの同時SSEストリームを持つことで問題は少なくなります。

+0

素晴らしい情報をありがとう!私はSSEを使用しようとしましたが、これまでのところ大成功を収めています。私が望んでいたよりも優れていて、ウェブページを開いている人に進捗報告を送ることができます! Webソケットなしのリアルタイム監視。ネアート! – mpen

関連する問題