BonBonSlick
@BonBonSlick
Web Developer Trainee

Websocket или SSE что и когда использовать, почему?

Что, когда, зачем и почему?
Как выбрать между двумя?

Тестовый пример для рассмотрения, чат на подобии Slack / Discord.
Ауидо + Видео, сообщения.
Чат Группы и их подгруппы, комнаты.
Чат 1 на 1, или создавать конференции 1+ людей.

Приходилось использовать и то и другое, но скорее поддержка нежели написание с нуля, вот и не было времени понять почему было выбрано то что было выбрано.
  • Вопрос задан
  • 95 просмотров
Решения вопроса 2
bingo347
@bingo347
Ткнуть в доку лучше готового к копипасте ответа
Websocket - двухсторонний бинарный протокол.
SSE - односторонний (только сервер шлет данные) текстовый протокол.

Оба работают поверх HTTP, но Websocket делает Switch Protocol (101 код ответа), а SSE - нет.

Websocket - требует дополнительной логики для кодирования/декодирования фреймов (сообщений). В браузере такая логика встроена и предоставляется объектом WebSocket, на других платформах как правило реализация протокола - забота программиста.
То что протокол двухсторонний означает, что любая сторона может послать данные в любой момент времени. Механизм запрос/ответ при этом в протоколе не реализован, но может быть сделан в нижележащих протоколах.
То что протокол бинарный означает, что через него можно передавать любые данные без ограничений.
То что протокол работает поверх HTTP - дает возможность при инициализации соединения отправить дополнительные данные в URI или заголовках (в браузере заголовки не доступны, однако отправляются куки согласно общим политикам)

SSE - это по сути обычный HTTP GET запрос с продолжительным ответом. А значит не требуется дополнительной логики для реализации, по сути это обычный HTTP.
Клиент может отправить свои данные только при инициализации в URI или заголовках (браузерная реализация опять таки не дает доступа к управлению заголовками, но хотя бы позволяет управлять отправкой кук, которые по умолчанию отправляются только на текущий домен, а для случая CORS их можно включить).
Сервер может отправлять любое количество текстовых сообщений, каждая строка начинается с "data: ", сообщение заканчивается двойным символом перевода строки, так же опционально может быть передан id сообщения отдельной строкой перед сообщением.
То что протокол текстовый - ограничивает передаваемые данные только текстом (например валидным utf8).

SSE в целом дешевле и по ресурсам и по передаваемому трафику, но имеет ряд ограничений по сравнению с WebSocket.
По поддержки браузерами у этих технологий все примерно одинаково, и на сегодняшний день можно смело утверждать, что поддержка обеих технологий есть везде.
Ответ написан
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Когда нужен односторонний поток данных с сервера на клиент - SSE, когда нужно двустороннее взаимодействие - WebSocket.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы