Heim > Backend-Entwicklung > Golang > Wie kann ich HTTP-Antworten in Golang streamen und Standardpufferung vermeiden?

Wie kann ich HTTP-Antworten in Golang streamen und Standardpufferung vermeiden?

Susan Sarandon
Freigeben: 2024-12-30 05:07:13
Original
606 Leute haben es durchsucht

How Can I Stream HTTP Responses in Golang and Avoid Default Buffering?

HTTP-Antworten in Golang streamen: Standardpufferung umgehen

Diese Anleitung befasst sich mit dem Problem der Pufferung bei der HTTP-Antwortverarbeitung in Go, bei der Antworten normalerweise gepuffert und in Blöcken gesendet werden Der Kunde wird nach der Bearbeitung der Anfrage benachrichtigt. Für Streaming-Szenarien ist dies möglicherweise nicht wünschenswert.

Der bereitgestellte Codeausschnitt veranschaulicht das Problem, bei dem zwei Datenzeilen gestreamt werden sollen, aber aufgrund der Pufferung stattdessen gleichzeitig gesendet werden.

Implementierung Leeren

Ein Ansatz zur Behebung dieses Problems besteht darin, den Antwortpuffer explizit zu leeren. Der ResponseWriter von Go stellt eine Flush-Methode bereit, deren Verfügbarkeit jedoch von der spezifischen Implementierung abhängt.

Als Beispiel beinhaltet der folgende geänderte Code das Flushing:

func handle(res http.ResponseWriter, req *http.Request) {
  fmt.Fprintf(res, "sending first line of data")
  if f, ok := res.(http.Flusher); ok {
    f.Flush()
  }
  sleep(10) //not real code
  fmt.Fprintf(res, "sending second line of data")
}
Nach dem Login kopieren

Externe Ausgabe weiterleiten

In bestimmten Szenarien, wie zum Beispiel beim Streamen der Ausgabe eines externen Befehls, reicht das direkte Leeren möglicherweise nicht aus. Der Pipe-Mechanismus von Go ermöglicht ein direktes Streaming zwischen der Ausgabe des Befehls und dem Antwortschreiber.

Hier ist eine Beispielimplementierung:

pipeReader, pipeWriter := io.Pipe()
cmd.Stdout = pipeWriter
cmd.Stderr = pipeWriter
go writeCmdOutput(res, pipeReader)
err := cmd.Run()
pipeWriter.Close()

func writeCmdOutput(res http.ResponseWriter, pipeReader *io.PipeReader) {
  buffer := make([]byte, BUF_LEN)
  for {
    n, err := pipeReader.Read(buffer)
    if err != nil {
      pipeReader.Close()
      break
    }

    data := buffer[0:n]
    res.Write(data)
    if f, ok := res.(http.Flusher); ok {
      f.Flush()
    }
    //reset buffer
    for i := 0; i < n; i++ {
      buffer[i] = 0
    }
  }
}
Nach dem Login kopieren

Erweiterte Option: TCP-Hijacking

Für mehr Flexibilität ist es möglich, den TCP-Hijacker zu verwenden, der eine direkte Kontrolle über die TCP-Verbindung gewährt. Dieser Ansatz erfordert jedoch ein tieferes Verständnis der Netzwerkprogrammierung und wird für allgemeine Anwendungsfälle weniger empfohlen.

Vorbehalte

Beachten Sie, dass es dennoch zu Pufferungen in Netzwerkkomponenten oder innerhalb der Client-Anwendung kommen kann Es ist von entscheidender Bedeutung, Ihren spezifischen Anwendungsfall zu bewerten, um festzustellen, ob eine explizite Spülung oder alternative Lösungen erforderlich sind.

Das obige ist der detaillierte Inhalt vonWie kann ich HTTP-Antworten in Golang streamen und Standardpufferung vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage