Long polling — техника получения обновлений, при которой клиент делает HTTP-запрос, а сервер держит его открытым, пока не появятся новые данные или не истечёт таймаут. После получения ответа клиент сразу делает новый запрос.
func longPollHandler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), 30*time.Second)
defer cancel()
select {
case msg := <-updates:
json.NewEncoder(w).Encode(msg)
case <-ctx.Done():
w.WriteHeader(http.StatusNoContent) // таймаут, нет данных
}
}
Плюсы: работает везде (просто HTTP), не нужен WebSocket, проходит через любые прокси и файрволы. Минусы: каждое обновление — новое HTTP-соединение (overhead), задержка равна RTT, сервер держит открытые соединения.
Long polling — самый простой способ получить near-real-time без WebSocket. Telegram Bot API, например, использует именно long polling. Для большинства задач сейчас лучше SSE или WebSocket, но long polling всё ещё жив.