> Что такое WebSocket и в каких сценариях его использовать (Python)

Уровень: junior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: Sunlight

Стек: Python

> Пример ответа

Короткий ответ

WebSocket - это протокол поверх TCP, который устанавливает постоянное двустороннее соединение между клиентом и сервером. В отличие от HTTP, где каждый запрос открывает новое соединение, WebSocket позволяет обеим сторонам отправлять сообщения в любой момент без повторного handshake. Используется для real-time сценариев: чаты, уведомления, онлайн-игры, биржевые котировки, совместное редактирование, где нужна низкая задержка и серверная push-доставка.

Подробное объяснение

WebSocket работает в два этапа:

  1. Handshake - клиент отправляет обычный HTTP-запрос с заголовком Upgrade: websocket. Сервер отвечает статусом 101 Switching Protocols, после чего соединение переводится в постоянный двусторонний режим.
  2. Передача данных - после handshake обе стороны могут отправлять фреймы данных (текстовые или бинарные) в любой момент. Соединение остаётся открытым, пока одна из сторон его не закроет.

Ключевые отличия от HTTP:

  • Постоянное соединение - не нужно устанавливать новое TCP-соединение для каждого сообщения.
  • Двунаправленность - сервер может инициировать отправку данных без запроса клиента.
  • Низкий overhead - заголовки фреймов минимальны (2-14 байт) по сравнению с HTTP-заголовками.
  • Полный дуплекс - данные могут передаваться одновременно в обе стороны.

Сценарии использования:

  • Чат и мессенджеры - мгновенная доставка сообщений.
  • Уведомления в реальном времени - например, оповещения о новых событиях в админке.
  • Онлайн-игры - синхронизация состояния игроков.
  • Финансовые котировки - стриминг цен с минимальной задержкой.
  • Совместное редактирование - как в Google Docs.
  • Прогресс длительных задач - например, статус обработки видео или загрузки файла.

Когда WebSocket не нужен:

  • Обычные REST API - там достаточно HTTP.
  • Однонаправленный стриминг (например, видео) - лучше использовать SSE (Server-Sent Events).
  • Редкие запросы с большими интервалами - HTTP с keep-alive проще и надёжнее.

На практике

В Python для WebSocket чаще всего используют:

  • FastAPI - встроенная поддержка через websockets или starlette.
  • Django Channels - для Django-проектов.
  • aiohttp - имеет WebSocket-поддержку из коробки.
  • websockets - низкоуровневая библиотека для asyncio.

Важные моменты для backend:

  • WebSocket-соединения держат ресурсы (память, файловые дескрипторы). Нужно управлять их количеством и закрывать неактивные.
  • Для горизонтального масштабирования нужен брокер сообщений (Redis Pub/Sub, RabbitMQ), чтобы серверы могли обмениваться сообщениями между собой.
  • Необходима обработка разрывов соединения и reconnect-логика на клиенте.
  • WebSocket не работает через обычные HTTP-прокси - нужна поддержка upgrade-запросов.

Пример кода

Пример WebSocket-эндпоинта на FastAPI:

PYTHON
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
app = FastAPI()
class ConnectionManager:
def __init__(self):
self.active_connections: list[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
await manager.broadcast(f"User says: {data}")
except WebSocketDisconnect:
manager.disconnect(websocket)
await manager.broadcast("User left the chat")

Как отвечать на собеседовании

  • Начни с краткого определения: постоянное двустороннее соединение поверх TCP.
  • Сравни с HTTP: укажи, что HTTP - запрос-ответ, WebSocket - full-duplex.
  • Приведи 2-3 конкретных сценария, где WebSocket оправдан.
  • Упомяни ограничения: сложность масштабирования, необходимость управления соединениями.
  • Если спросят про альтернативы - назови SSE и long polling, объясни, когда они лучше.

Что проверяет интервьюер

  • Понимаешь ли ты разницу между HTTP и WebSocket.
  • Знаешь ли ты, как работает handshake (Upgrade-заголовок, статус 101).
  • Понимаешь ли ты, в каких случаях WebSocket - правильный выбор, а в каких - избыточен.
  • Знаешь ли ты про проблемы масштабирования и необходимость брокеров сообщений.
  • Умеешь ли ты написать простой WebSocket-эндпоинт на Python.

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

  • Путать WebSocket с HTTP long polling или SSE.
  • Говорить, что WebSocket - это "просто TCP-сокет" - да, но с HTTP-handshake и фреймированием.
  • Не упоминать, что WebSocket не работает через обычные HTTP-прокси и CDN без специальной настройки.
  • Предлагать WebSocket для простых REST-задач, где достаточно обычного HTTP.
  • Забывать про управление соединениями: утечки памяти, неактивные соединения, лимиты на количество открытых сокетов.
  • Не знать, что для горизонтального масштабирования нужен внешний брокер (Redis Pub/Sub), а не только локальный менеджер соединений.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью