Warum sind anfängliche Verbindungen immer langsamer

569
Kirk122

Das ist mir zum ersten Mal aufgefallen, als ich mit Insomnia (HTTP-Clients) einige meiner API-Endpunkte testete.

Die erste Anforderung, die ich an meinen API-Server (und andere) sende, ist immer mindestens 100 ms, aber sequenzielle Anforderungen sind immer sehr schnell.

First Request Image

Second Request Image

Wie ist das möglich? Ich habe versucht, bei jeder Anfrage Zufallsdaten zu senden, und dies geschieht immer noch. Ich habe kürzlich auch von dem QUIC-Protokoll von Google gehört, das die Round-Trip-Anfragen für Handshake-Anfragen für allgemeine Server von ~ 3 auf 0 reduzieren soll . Dies ist sehr sinnvoll für das Geschehen, aber QUIC ist noch nicht einmal im Internet implementiert.

2
Ist DNS beteiligt? Kamil Maciorowski vor 5 Jahren 2
Haha. Das war es dann Aber warum dauert DNS 100ms +? Kirk122 vor 5 Jahren 0
Das hängt wirklich von Ihrem Setup ab. Eine mögliche Erklärung (unter Berücksichtigung von DNS) wäre jedoch, dass Ihr Client keinen zwischengespeicherten Eintrag für diesen Server hat. Bevor eine Anfrage gestellt werden kann, muss also eine DNS-Suche durchgeführt werden, um zu wissen, zu welchem ​​Server eine Verbindung hergestellt werden soll. Der Server und Ihr Client können auch Keep Alive unterstützen, sodass die Verbindung zwischen Anforderungen möglicherweise nicht geschlossen wird. Seth vor 5 Jahren 2
QUIC kann Latenzen reduzieren, jedoch nicht auf null. Es funktioniert, indem ein eigener Mechanismus erstellt wird, der sich ähnlich wie tcp mit udp verhält und einige der Grenzen des tcp-Protokolls überwindet. Es ist zwar keine Zauberei. davidgo vor 5 Jahren 0
Es kann auch die Sitzungsverwaltung auf dem Remote-Endpunkt sein. Beim ersten Verbinden werden Ressourcen für die Verbindung zugewiesen und Threads gestartet. Danach verwenden Sie einfach dieselben Ressourcen, bis sie einen Timeout haben und freigegeben sind. Appleoddity vor 5 Jahren 0
Wenn Sie HTTPS verwenden, wird die TLS-Sitzung möglicherweise zwischengespeichert, was beim Verbindungsaufbau viel Zeit sparen kann. Es kann auch nur die Verbindung nach der ersten Anforderung offen gehalten werden (was natürlich den Verbindungsaufbau entfällt). Austin Hemmelgarn vor 5 Jahren 0
@AustinHemmelgarn Ist dieses normale Verhalten für normale HTTP-APIs mit Vanilla-HTTP-Clients? zB Express / Hapi mit Postman. Kirk122 vor 5 Jahren 0
@ Kirk122 Es ist nicht "normal", aber es ist auch nicht "nicht normal", es hängt wirklich nur vom Rahmen ab. Wenn Sie beispielsweise HTTP / 2 verwenden, sind Sie fast sicher, dass Sie Pipelining-Anforderungen haben (dies ist ein impliziter Bestandteil von HTTP / 2). Wenn Sie HTTP / 1.0 (oder 0.9) verwenden, ist das Pipelining von Natur aus nicht möglich. Bei HTTP / 1.1 hängt es von der Serverkonfiguration und dem Anwendungsframework ab. Austin Hemmelgarn vor 5 Jahren 0

1 Antwort auf die Frage

0
Keltari

Wie bereits in den Kommentaren zu Ihrem ersten Beitrag erwähnt, könnte es sich um DNS handeln, was eine sehr vernünftige Idee bezüglich der Ursache der Verzögerung ist.

Es gibt jedoch keine Möglichkeit, die tatsächliche Antwort auf Ihre Frage zu erfahren. Wir wissen nicht, was mit Ihrem Setup los ist, und wir können es auch nicht ohne Zugriff.

Es gibt ein Werkzeug, mit dem Sie das Problem diagnostizieren können. Fiddler ist ein hervorragendes Werkzeug, in dem ich mich sehr empfehlen kann. Es kann helfen, webbasierte Probleme zu diagnostizieren. Ich schlage vor, Sie probieren es aus.