私が作成しているAPIにHTTPリクエストを行うサードパーティは、APIが1秒未満で応答することを要求しています。私の質問は、彼らが道持っているされて(文字通りあらゆるの範囲内で、道をHTTPおよび/またはTCP / IPプロトコル)それは長い1秒以上かかる場合は、私のコードの実行を中止するには?
私が作成しているAPIにHTTPリクエストを行うサードパーティは、APIが1秒未満で応答することを要求しています。私の質問は、彼らが道持っているされて(文字通りあらゆるの範囲内で、道をHTTPおよび/またはTCP / IPプロトコル)それは長い1秒以上かかる場合は、私のコードの実行を中止するには?
回答:
HTTPはそのようには機能しません。クライアントがリクエストを送信し、サーバーがレスポンスを返します。他の通信は発生しません。サーバーは、メインの応答の前に1xxの情報応答を送信できます。ただし、クライアントが送信済みリクエストに関する更新を送信する方法はありません。
(同じ接続で複数のリクエストを多重化できるHTTP / 2の場合は状況が大きく異なります。サーバーからPUSH_PROMISEを受信した後、クライアントはストリームをキャンセルしてそれが不要であることを示すことができます。HTTP/ 2は無視しますこの答えの残りのために。)
また、ネットワークはそのように機能しません。特に、分散コンピューティングの 2番目の誤り「レイテンシはゼロ」を参照してください。そうではない。その1秒のタイムアウトのうち、接続の確立と要求の送信に400ミリ秒、応答に600ミリ秒が費やされた可能性があります。パケットの1つがドロップされ、すべてを再送信する必要があり、クライアントはオーストラリアにいるためです。サーバーに十分な時間がない可能性があるという問題は別として、サーバーは応答待ち時間を事前に知ることができないため、サーバーがどれだけの時間を持っているかも知りません。
これらのタイムアウトを文字通り実装することは不可能であることを考えると、どのようなソリューションで十分でしょうか?
タイムアウト後に応答に値がない場合、クライアントは単に接続を閉じることができます。これにより、応答が無視されますが、応答が妨げられることはありません。
HTTP要求が送信されるTCP接続を閉じると、サーバーに通知されます。ただし、この通知は遅延して到着するだけなので、遅すぎる可能性があります。また、クライアントソケットが閉じている場合、Webフレームワークは何も実行していない可能性があります。その場合、閉じたソケットに書き込もうとすると、「ピアによって接続がリセットされました」というエラーが発生します。
応答の処理に1秒以上費やしたくない場合は、そのタイムアウトの実装は完全にユーザーの責任であり、ネットワークやHTTPとは関係ありません。
サーバーにタイムアウトを提供するようにクライアントに要求できます。これにより、サーバーが期限に間に合わない場合はサーバーを中止できます。これは、カスタムヘッダーとして、またはURLのクエリパラメーターとして指定できます。この期限は期間ではなく絶対的な時間である必要があります。これにより、送信の遅延も利用可能な時間を消費します。ただし、1秒未満の精度は困難です。サーバーとクライアントを正しい時刻に同期させ、適切なクロックを使用する必要があります。セットアップによっては、正しく構成されている場合でも、ソースが毎回100msオフになる場合があります。これは、時間の予算のかなりの部分をすでに消費しています。
彼らは接続を閉じることができると思いますが、それによって実際にコードが異常終了するかどうかはわかりません。コードの記述方法によって異なります。
彼らはまた、「時間がかかりすぎるので気にしないでください」という意味の別のメッセージを送信することもできますが、その場合は、おそらく明示的なCANCEL_REQUESTメッセージを処理する準備が整っているはずです。