2016-10-05 7 views
0
状況が

は、私は大容量のファイルを変換REST APIのHTTP/2固有の機能を使用すべき

私のチームは、大規模な構造化テキストファイルを受け取り、API作成され

(100メガバイト - 1TBを、1ギガバイトを期待)各行を変更して結果のファイルを返します。ファイルを送信したときと同じ速さで処理できるため、サーバー上のファイルをキャッシュしないようにしたいと考えています。私たちは、私たち自身のリソース使用に比べてクライアントの使いやすさを好むので、これは厳しい要件ではありません。

いくつかのオプション

HTTP/1.1は、暗黙的に応答が(except in the case of errorsand bad things can happen, especially with proxies, if you try to get around this送信される前に、完全なリクエストが処理されている必要があります。だから私たちは弾丸に噛み付いてリクエストやレスポンスを保存し、処理のために大きなファイルをアップロードするために組織内の別のリソースを使用します。

HTTP/2 explicitly allows you to send before the request has finished and requires that the client read what you sendとHTTP/2は、すべての主要なブラウザで既にサポートされています。

だから、私はいくつかの潜在的なAPI(すべてのPOST)を参照してください。

HTTP1.x: - :単一の要求

アップロード/ダウンロード、すでにこの

/transformed_file_id/ --> returns id for the uploaded file 
/transformed_file/{id} --> returns the transformed data 

HTTP1.xのためのいくつかのインフラストラクチャがあります

/transformed_file/ --> returns the transformed version of the file - stores stuff under-the-hood 

HTTP2:単一の要求

/transformed_file/ --> returns the transformed version of the file - starts sending response as soon as it receives the first couple of K. 

質問(複数可)

私は、ブラウザのコンテンツを離れてから恥ずかしがり屋ではないでしょうが、それはこの機能にアクセスするためにサービスのためにHTTP/2を使用するのが賢明でしょうか?

これはすべて悪い考えであり、クライアントは一度にファイルの小さな部分をアップロードする必要があります(ブラウザインターフェイスでこれを許可するにはフロントエンドを作成する必要があります。かなり厳しい)。

答えて

3

さまざまなクライアント、サーバー、およびプロキシでの私の経験では、HTTP/1.1では、アプリケーションが応答を開始する前に完全な要求を送信する必要があるとは限りません。それはいつも起こります。

一方、クライアントが100 MiB-1 TiBのデータ(!)を1回のリクエストでアップロードする必要がある場合は、ダウンロードの範囲ヘッダーと同様にアップロードエラーを回復するメカニズムを設定します。 も参照してください:Standard method for HTTP partial upload, resume upload

HTTP/2と大きなアップロードでは、クライアントのフローコントロール送信ウィンドウに特に注意する必要があります。 これは、デフォルトでは64 KiBです。つまり、クライアントがそのコンテンツを確認するのを待つ前に最大64 KiBしか送信できません。 肯定応答はサーバーからクライアントに移動する必要があるため、ここではネットワークの待ち時間が重要な役割を果たします。クライアントは64 KiBを書き込む際に非常に高速ですが、サーバーの確認応答を待つ時間がほとんどありません。 これにより、アップロードがひどく遅くなる可能性があります。

ブラウザー(Firefox)は受信ウィンドウを変更して、64 KiBから12 MiB(ほぼ200x)のサーバーからの高速ダウンロードを実行できるようにします。 残念ながら、アップロードでは同じことをしません。

クライアントがブラウザであるかどうかを指定しません。そうでない場合は、フロー制御ウィンドウの構成を制御し、送信と受信の両方を制御できることを確認し、フロー制御の確認応答で減速しないように十分に拡大してください。

0

前述のように、HTTP/1.1はストリーミングダウンロードをサポートしています。これは、大きなファイルをダウンロードするたびに発生します。

しかし、あなたのユースケースは新しいファイルのダウンロードを同時にアップロードするのには良いとは思いません。クライアントが1TBをアップロードするにはどれくらいの時間がかかりますか?接続が途中まで落ちたらどうなりますか?

クライアントがファイル全体をアップロードしてからバックグラウンドで処理できるようにする方が簡単で安全な場合があります。終了すると、クライアントはブラウザを使用してファイル全体をダウンロードできます。

アップロードプロセスを管理するには、良い方法が必要だと思います。 Javascriptやエクステンションを作成することもできますが、既に利用可能なアップロードマネージャの拡張機能がたくさんあるはずです。 HTTPやブラウザ経由のファイル転送は堅牢です。

関連する問題