HTTPリクエスト-私たちはすべて間違っています

私が取り組んでいるプロジェクトでは、膨大な数のサードパーティライブラリを使用しています。 それらの多くは、さまざまなサービス用のアダプターです。 それらを結び付けるのは、ネットワークと連携することです。 http上のJson、http上のsoap、httpの上にあるプロトコルの一部。 つまり とにかく誰もがhttpを使用しています。 そして驚くべきことに、最新バージョンを利用するものはほとんどありません。 Wikipediaを見るのが面倒ではありませんでした。http1.1の仕様が採用されてからちょうど14年が経ちました。 そして、私はアピールすることにしました:
画像

はい、それはキープアライブについてです。 要するに、http 1.1以降、クライアントとサーバーは、要求の完了後に確立されたtcp接続を閉じず、次の要求に再利用することに同意できるということです。 これは、接続の確立に時間がかかるためです。 この時間は、リクエスト自体の時間より長い場合があります。 そして、すべてのサーバーがこの機能をかなり前にサポートし、すべてのブラウザーと他のほとんどのクライアントがこの機能を使用する場合、一般的なプログラミング言語のさまざまなライブラリーの開発者には何らかの理由でギャップがあります。
単一のサーバーに10個のリクエストを連続して送信する単純なPHPコードを考えてみましょう。

<?php
for ($i = 0; $i < 10; $i += 1) {
	$ch = curl_init();
	curl_setopt_array($ch, array(
		CURLOPT_URL => "https://evernote.com/favicon.ico",
		CURLOPT_VERBOSE => True,
		CURLOPT_RETURNTRANSFER => True,
	));
	$resp = curl_exec($ch);
	curl_close($ch);
}

95% , . CURLOPT_VERBOSE , curl . 9 ( ):

* Connection #0 to host evernote.com left intact
* Closing connection #0
* About to connect() to evernote.com port 443 (#0)
*   Trying 204.154.94.73...

, curl , . : 10 10 , 17 .

, curl http 1.1, . :

<?php
$ch = curl_init();
for ($i = 0; $i < 10; $i += 1) {
	curl_setopt_array($ch, array(
		CURLOPT_URL => "https://evernote.com/favicon.ico",
		CURLOPT_VERBOSE => True,
		CURLOPT_RETURNTRANSFER => True,
	));
	$resp = curl_exec($ch);
}
curl_close($ch);

, :

* Connection #0 to host evernote.com left intact
* Re-using existing connection! (#0) with host (nil)
* Connected to (nil) (204.154.94.73) port 443 (#0)

5,5 . , . . , http ssl, . , .

, , 10 http https keep-alive . 5-6 .

evernote.com/favicon.ico, ≈ 200 ms, 27054 .
ReconnectKeep-AliveRatio
http1052x
https175,53,1x

twitter.com/favicon.ico, ≈ 200 ms, 1150 .
ReconnectKeep-AliveRatio
http4,32,51,7x
https8,52,73,1x

yandex.st/lego/_/pDu9OWAQKB0s2J9IojKpiS_Eho.ico, ≈ 17 ms, 1150 .
ReconnectKeep-AliveRatio
http0,330,171,9x
https0,80,24x

. , , . curl — curl_init() , , ( , ). curl_close() , . Curl , , .

, , curl php. , . , python urllib3requests. , curl php, , . , . stripe. 2 , , . pyuploadcare. — requests.request() session, .

, , , .


Source: https://habr.com/ru/post/J184302/


All Articles