Для чего нужны WebSocket
Что проверяют
Понимаете ли вы, когда нужен постоянный двусторонний канал, а когда хватит обычного HTTP или SSE. Следом обычно спрашивают, как устанавливается соединение и что вы делаете при обрыве связи.
Как отвечать
WebSocket (RFC 6455) это протокол полнодуплексного обмена сообщениями поверх одного TCP-соединения. Начинается он с обычного HTTP-запроса с заголовками Upgrade: websocket и Sec-WebSocket-Key, сервер отвечает 101 Switching Protocols, и дальше по тому же соединению в обе стороны ходят кадры WebSocket, текстовые или бинарные, без HTTP-заголовков на каждое сообщение. Схемы адресов ws:// и wss://, в продакшене используют только вторую.
Нужен он там, где сервер должен сам сообщать о событиях, а клиент тоже часто пишет: чаты, совместное редактирование, многопользовательские игры, биржевые стаканы, живые дашборды с командами от пользователя.
В браузере это new WebSocket(url), события open, message, close, error и метод send(). Стоит сразу назвать, чего этот API не даёт:
- переподключения: его пишут сами, с экспоненциальной задержкой и досылкой пропущенного после восстановления;
- своих заголовков: при подключении нельзя передать
Authorization, поэтому авторизуют кукой, первым сообщением или одноразовым токеном в URL; - протокола сообщений: типы, идентификаторы, подтверждения доставки проектируете вы или берёте библиотеку вроде Socket.IO, у которой свой протокол поверх WebSocket.
Сравните с альтернативами. SSE через EventSource передаёт данные только от сервера, зато работает поверх обычного HTTP и сам переподключается. Long polling проще в инфраструктуре, но дороже на каждом сообщении.
Где спотыкаются
Берут WebSocket для ленты уведомлений, где клиент ничего не отправляет. Там SSE проще и спокойнее проходит через прокси и балансировщики.
Не закрывают соединение при уходе со страницы или в cleanup у useEffect. Получаются утечки и дублированные сообщения после повторного монтирования компонента.
Забывают, что соединение рвётся: сон ноутбука, смена сети, таймаут прокси. Без переподключения и пересинхронизации состояния интерфейс молча показывает устаревшие данные.