WebSocket и SSE

Тема дорожной карты · Backend разработчик

WebSocket — полнодуплексный, двунаправленный протокол связи, построенный поверх HTTP, устанавливающий постоянное TCP-соединение между клиентом и бэкенд-сервером и обеспечивающий push данных в реальном времени без накладных расходов polling'а повторяющихся REST API-вызовов. Рукопожатие WebSocket начинается как HTTP Upgrade-запрос, после чего соединение переключается на протокол ws:// или wss:// (TLS-защищённый), поддерживая открытый канал, через который обе стороны могут отправлять фреймы в любое время. Бэкенд WebSocket-серверы реализуются нативно в Node.js (ws, Socket.IO), Python (websockets, Django Channels на основе Redis channel layers), Go (gorilla/websocket) и Java (Spring WebSocket со STOMP); они требуют sticky sessions или внешнего pub/sub-брокера вроде Redis для распределения сообщений между горизонтально масштабируемыми экземплярами. WebSocket-соединения по своей природе stateful, что означает: балансировщики нагрузки должны быть настроены с session affinity (или состояние соединения экстернализировано в Redis), чтобы не разрывать активные соединения во время событий горизонтального масштабирования в Kubernetes. Мониторинг WebSocket-инфраструктуры требует отслеживания активных счётчиков соединений, скоростей сообщений и частот ошибок соединений через метрики Prometheus; TLS (wss://) всегда должен использоваться в продакшене для защиты потока данных теми же гарантиями безопасности, что и у HTTPS REST API-эндпоинтов.

Как это работает

WebSocket и SSE — request/response протокол поверх TCP (или QUIC для HTTP/3). Запрос имеет метод (GET, POST, PUT, DELETE, PATCH), URL, заголовки, опциональное тело; ответ — статус-код (2xx success, 3xx redirect, 4xx client, 5xx server), заголовки, тело. HTTP/1.1 — одно TCP-соединение на запрос (с keep-alive переиспользованием); HTTP/2 мультиплексирует много запросов в одно соединение; HTTP/3 — поверх UDP через QUIC. TLS (HTTPS) обязателен в 2026.

Когда применять

HTTP/REST — для большинства публичных API: lingua franca, поддерживается клиентами, тулинг для отладки повсюду. gRPC — для internal service-to-service, когда важны latency + schema-дисциплина. WebSockets — для двунаправленного realtime. SSE (Server-Sent Events) — для server-push-only. Всегда за reverse proxy (Caddy, nginx, traefik), который держит TLS, сжатие, rate limit.

Типичные ошибки

Ловушки WebSocket и SSE: 200 OK с {"error": "..."} вместо нормальной 4xx/5xx (ломает client retry и observability); игнор Idempotency-Key для POST, создающего ресурсы (retry дублируют); session-токены в URL (логируются везде); нет gzip/brotli (медленные клиенты на плохих сетях); Server: header выдаёт версию стека. Прочтите RFC 9110 (HTTP semantics) один раз.

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…