Heim >Backend-Entwicklung >Golang >Wie erreicht man Streaming-HTTP-Antworten und deaktiviert die Pufferung in Go?

Wie erreicht man Streaming-HTTP-Antworten und deaktiviert die Pufferung in Go?

DDD
DDDOriginal
2024-12-24 02:58:10301Durchsuche

How to Achieve Streaming HTTP Responses and Disable Buffering in Go?

Streaming von HTTP-Antworten in Go: Deaktivieren Sie die Pufferung in http.ResponseWriter

Streaming von HTTP-Antworten ermöglicht das schrittweise Senden von Daten an den Client. anstatt darauf zu warten, dass die gesamte Anfrage verarbeitet wird. Dieser Ansatz verbessert das Benutzererlebnis, indem er sofortiges Feedback liefert und die wahrgenommene Latenz reduziert. In Go ist die http.ResponseWriter-Schnittstelle für das Senden von Antworten an den Client verantwortlich. Standardmäßig werden die Daten jedoch gepuffert, bis die Anfrage abgeschlossen ist.

Lösung: Verwenden Sie die Flusher-Schnittstelle

Um die Pufferung zu deaktivieren und Antworten zu streamen, können wir den Flusher nutzen Schnittstelle, die von einigen ResponseWriter-Typen implementiert wird. Mit der Flusher-Schnittstelle können wir alle gepufferten Daten manuell an den Client leeren.

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func handle(res http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(res, "sending first line of data")

    // Check if ResponseWriter implements Flusher interface
    if f, ok := res.(http.Flusher); ok {
        f.Flush()
    } else {
        log.Println("Damn, no flush")
    }

    time.Sleep(10 * time.Second) // Simulate a delay

    fmt.Fprintf(res, "sending second line of data")
}

Durch die Einbindung der Flusher-Schnittstelle können wir die gepufferten Daten nach dem Schreiben jedes Teils der Antwort explizit leeren. Dadurch wird sichergestellt, dass die Daten sofort an den Client gesendet werden, was zu einer gestreamten Antwort führt.

Alternative Lösung: Hijacking the Connection

Ein anderer Ansatz besteht darin, das zugrunde liegende TCP zu kapern Verbindung der HTTP-Anfrage. Dies ermöglicht eine direkte Interaktion mit dem Socket und eine individuelle Anpassung des Datenübertragungsprozesses, einschließlich der Deaktivierung der Pufferung. Dieser Ansatz ist jedoch komplexer und erfordert ein tieferes Verständnis der zugrunde liegenden Netzwerkschicht.

Autoflushing: Keine integrierte Funktion

Leider ist Go's http.ResponseWriter bietet keine automatische Spülfunktion. Dies bedeutet, dass der Entwickler dafür verantwortlich ist, die Daten bei Bedarf manuell zu löschen. Einige Frameworks oder Bibliotheken von Drittanbietern bieten jedoch möglicherweise Funktionen zur automatischen Spülung.

Das obige ist der detaillierte Inhalt vonWie erreicht man Streaming-HTTP-Antworten und deaktiviert die Pufferung in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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