Heim > Artikel > Backend-Entwicklung > golang HTTP-Timeout-Einstellung
Go-Sprache ist eine effiziente Programmiersprache, die gleichzeitige Programmierung unterstützt und sich daher hervorragend für die Netzwerkprogrammierung eignet. Das HTTP-Protokoll ist ein wichtiger Bestandteil beim Erstellen von Internetanwendungen. Das http-Paket in der Go-Sprache bietet außerdem eine große Anzahl von Schnittstellen zur Unterstützung von HTTP-Anfragen und -Antworten. Bei HTTP-Netzwerkaufrufen ist die Timeout-Konfiguration sehr wichtig, um die Stabilität und Leistung des Programms sicherzustellen.
Die Timeout-Einstellung ist ein sehr wichtiges Thema. Sie wird verwendet, um zu definieren, wie lange das Programm warten muss, wenn es eine Netzwerkanfrage stellt oder auf eine Antwort wartet. Wenn der Server bei einer HTTP-Anfrage nicht rechtzeitig antwortet, muss der Client die Anfrage beenden und eine andere Logik ausführen. Ebenso kann es bei der Antwort einer langen Verbindung dazu kommen, dass das gesamte Programm hängen bleibt, wenn der Client auf eine Antwort gewartet hat und die Verbindung nicht innerhalb des Zeitlimits aufrechterhalten kann.
Daher wurde in der Go-Sprache in den letzten Jahren sehr aktiv an Kontrollschemata und technischen Lösungen für Timeout-Einstellungen geforscht. In diesem Artikel werden die Timeout-Einstellungen bei HTTP-Netzwerkaufrufen mit der Go-Sprache ausführlich vorgestellt.
In der Go-Sprache kann das Timeout-Limit über das Zeitpaket implementiert werden. Das Zeitpaket stellt einen Timer-Typ bereit, der zum Implementieren der Timeout-Verarbeitung und des Timings verwendet werden kann. Verwenden Sie Timer, um einen Zeitraum zu erstellen, der nach einer bestimmten Zeitspanne endet. Wir können abfragen, ob dieser Timer abgelaufen ist. Wenn der Timer abgelaufen ist, führen Sie eine Aktion aus, z. B. das Abbrechen der Anfrage oder die Auswahl eines alternativen Servers. Die spezifische Implementierung lautet wie folgt:
timer := time.NewTimer(timeout) defer timer.Stop() select { case <-ch: return case <-timer.C: cancel() return }
Der obige Code verwendet den C-Kanal von select und den Timer zum Warten. Wenn Kanal ch Daten an den Empfänger sendet, führt select den entsprechenden Vorgang aus. Wenn der Timer abgelaufen ist, wird eine Abbruchfunktion aufgerufen, um den laufenden Vorgang abzubrechen.
In der Go-Sprache ist das Kontextpaket ein gutes Timeout-Einstellungstool. Das Kontextpaket bietet eine Möglichkeit, Werte, Abbruchsignale und Fristen über Aufrufe mehrerer Goroutinen hinweg zu steuern. Die context.WithTimeout-Methode steuert das Timeout, indem sie ein Timeout für den Kontext festlegt und einen neuen Kontext zurückgibt. Wenn der Vorgang innerhalb der angegebenen Zeit abgeschlossen ist, wird der Timeout-Timer ausgeschaltet. Wenn der Vorgang nicht innerhalb der angegebenen Zeit abgeschlossen wird, schalten Sie den Timeout-Timer aus und brechen Sie den laufenden Vorgang ab. Dies macht context.WaitGroup ideal für die Ausführung mehrerer Goroutinen. Die spezifische Implementierung lautet wie folgt:
ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { log.Fatal(err) } res, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { log.Fatal(err) }
Im obigen Code wird über die context.WithTimeout-Methode ein Timeout-gesteuerter Kontext erstellt. Erstellen Sie dann eine http-Anfrage und verknüpfen Sie den Kontext mit dem Anfrageobjekt über die Methode http.NewRequestWithContext. Verwenden Sie abschließend die Methode http.DefaultClient.Do, um eine Netzwerkanforderung zu stellen und den Antwortinhalt zu lesen, nachdem die Anforderung abgeschlossen ist. Wenn eine Zeitüberschreitung auftritt, wird der Kontext abgebrochen und alle nachfolgenden Anforderungen blockiert.
Bei der Verwendung von Timeout-Einstellungen müssen Sie auf die folgenden Punkte achten:
# 🎜🎜 #3.1 Legen Sie eine angemessene Zeitüberschreitung fest: Die Zeitüberschreitung sollte lang genug sein, um die für die Verarbeitung von HTTP-Anfragen und -Antworten erforderliche Zeit zu ermöglichen, aber nicht so lang, dass das Programm nicht hängen bleibt. Wenn das Zeitlimit zu lang eingestellt ist, kann es sein, dass die Anwendung nicht auf andere Vorgänge reagiert. Wird das Timeout zu kurz eingestellt und die Anfrage zu schnell abgebrochen, kommt es zu unnötigen Fehlern. Daher sollte das Timeout entsprechend der tatsächlichen Situation eingestellt werden. 3.2 Verwenden Sie die withContext-Methode, um das Zeitlimit festzulegen Wenn wir eine Netzwerkanfrage stellen, sollten wir den Kontext auf die http.NewRequestWithContext-Methode setzen, die sicherstellen kann, dass die Anfrage und Timeout sind eng verbunden. Wenn Sie die Timeout-Einstellung nur in http.Client.Transport festlegen, kann es zu Anforderungsfehlern kommen. 3.3 Anforderungswiederholungen ordnungsgemäß steuern: Bei Netzwerkanfragen sollte darauf geachtet werden, die Anzahl der Anforderungswiederholungen ordnungsgemäß zu steuern. Wenn bei der Anfrage eine Zeitüberschreitung auftritt, sollten wir voreinstellen, wie oft die Anfrage erneut versucht werden kann, um zu versuchen, die Ergebnisse an den Benutzer weiterzuleiten, anstatt sie direkt zu beenden.Das obige ist der detaillierte Inhalt vongolang HTTP-Timeout-Einstellung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!