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



@BonBonSlick

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

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

Приходилось использовать и то и другое, но скорее поддержка нежели написание с нуля, вот и не было времени понять почему было выбрано то что было выбрано.


Решения вопроса 2



@bingo347

Websocket — двухсторонний бинарный протокол.
SSE — односторонний (только сервер шлет данные) текстовый протокол.

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

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

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

SSE в целом дешевле и по ресурсам и по передаваемому трафику, но имеет ряд ограничений по сравнению с WebSocket.
По поддержки браузерами у этих технологий все примерно одинаково, и на сегодняшний день можно смело утверждать, что поддержка обеих технологий есть везде.



1

комментарий


Ответы на вопрос 0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *