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 .

Reconnect Keep-Alive Ratio
http 10 5 2x
https 17 5,5 3,1x


twitter.com/favicon.ico, ≈ 200 ms, 1150 .

Reconnect Keep-Alive Ratio
http 4,3 2,5 1,7x
https 8,5 2,7 3,1x


yandex.st/lego/_/pDu9OWAQKB0s2J9IojKpiS_Eho.ico, ≈ 17 ms, 1150 .

Reconnect Keep-Alive Ratio
http 0,33 0,17 1,9x
https 0,8 0,2 4x


. , , . curl — curl_init()



, , ( , ). curl_close()



, . Curl , , .



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



session



, .



, , , .



All Articles