> Что такое WebSocket и в каких сценариях его использовать (Python)
Уровень: junior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: Sunlight
Стек: Python
> Пример ответа
Короткий ответ
WebSocket - это протокол поверх TCP, который устанавливает постоянное двустороннее соединение между клиентом и сервером. В отличие от HTTP, где каждый запрос открывает новое соединение, WebSocket позволяет обеим сторонам отправлять сообщения в любой момент без повторного handshake. Используется для real-time сценариев: чаты, уведомления, онлайн-игры, биржевые котировки, совместное редактирование, где нужна низкая задержка и серверная push-доставка.
Подробное объяснение
WebSocket работает в два этапа:
- Handshake - клиент отправляет обычный HTTP-запрос с заголовком
Upgrade: websocket. Сервер отвечает статусом101 Switching Protocols, после чего соединение переводится в постоянный двусторонний режим. - Передача данных - после 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:
PYTHONfrom fastapi import FastAPI, WebSocket, WebSocketDisconnectapp = 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), а не только локальный менеджер соединений.
> Похожие задачи по Python
Как оптимизировать выборку данных с использованием id вместо offset для пагинации
Какие ограничения при использовании только объектно ориентированного программирования без функционального
В чем разница протоколов TCP и UDP
Работали ли вы с SOAP
> Похожие задачи по backend
Как оптимизировать выборку данных с использованием id вместо offset для пагинации
Какие ограничения при использовании только объектно ориентированного программирования без функционального
В чем разница протоколов TCP и UDP
Работали ли вы с SOAP
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью