Server-Sent Events (SSE) — протокол для одностороннего стриминга от сервера к клиенту поверх обычного HTTP. Проще WebSocket, но только в одну сторону.
func sseHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
flusher := w.(http.Flusher)
for {
select {
case event := <-events:
fmt.Fprintf(w, "data: %s\n\n", event)
flusher.Flush()
case <-r.Context().Done():
return
}
}
}
Формат простой: data: payload\n\n. Браузер сам переподключается при обрыве через встроенный EventSource API. Поддерживает event types, ID для восстановления и retry.
Когда использовать: уведомления, живые ленты, прогресс операций — всё, где данные идут только от сервера. Преимущество перед WebSocket: работает через стандартный HTTP, проходит через любые прокси и CDN.