← На главную

Баг Cloud Run: долгие SSE через HTTP/1.1 теряют разрыв — h2c и Go 1.24 чинят

19.05.2026 16:40 · hackernews

В сервисах на Google Cloud Run, которые используют долгие Server-Sent Events (SSE) с таймаутом в 15 минут, есть неприятный баг: при HTTP/1.1 Cloud Run не передаёт бэкенду сигнал о том, что клиент отключился. Чтобы это починить, автор решил перевести общение на HTTP/2.

Cloud Run сам завершает TLS на фронтенде, а дальше может гонять трафик как в HTTP/1.1, так и в «голом» HTTP/2 (h2c). Обычно HTTP/2 требует шифрования, но клиенты и серверы умеют работать и по открытому каналу. В Cloud Run нужно явно выбрать протокол — это та самая схема «HTTP/2 with Prior Knowledge» из RFC 9113.

Настройка Go-сервера под h2c до версии Go 1.24 была муторной. Приходилось подключать пакет golang.org/x/net/http2/h2c, вручную создавать http2.Server, оборачивать хендлер через h2c.NewHandler, а потом ещё раз вызывать http2.ConfigureServer. Кода много, логика размазана.

С Go 1.24 всё стало гораздо проще. Никаких внешних пакетов — всё зашито прямо в http.Server. Достаточно создать структуру Protocols, включить SetHTTP1(true) и SetUnencryptedHTTP2(true). Настройка читается за секунду, без лишних обёрток.

Проверить локально легко — один curl с флагом --http2-prior-knowledge. Если h2c не настроен, команда сразу выдаст ошибку.

Дальше нужно сконфигурировать сам Cloud Run. В terraform достаточно указать порт с именем h2c и нужный номер. Таймаут для серверных бэкендов в Cloud Run по умолчанию стоит 60 минут — это удобно для долгих SSE-соединений. На уровне балансировщика ничего менять не пришлось: HTTPS с Serverless NEGs сам корректно апгрейдит соединение до HTTP/2.

Читать оригинал →