@LittleHome

WebSockets+Ajax или просто WebSockets?

Пишу интерактивное приложение основанное на WebSocket технологии. Часть, ответственную за рассылку сообщений я уже написал, но встал вопрос о написании пользовательского взаимодействия с сайтом. Проще говоря ситуации, когда пользователь что-либо делает, и данные об этом отправляются на сервер.
Большинство примеров в интернете образуют связку WebSocket+Ajax, где сокеты лишь рассылают информацию пользователям, а Ajax-запросы используются наоборот, для отправки запросов на сервер.
При этом сама технология WebSocket предусматривает возможность и самим клиентом отправки сообщений на сервер. Таким образом возникла дилемма - можно сделать используя Ajax, и по результатам обработки запроса пользователя, просто транслировать результаты через сокеты, а можно [и как мне кажется, вернее], работать исключительно через сокеты.
Помогите, пожалуйста, выбрать правильную архитектуру!
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
@jershell
Большинство примеров в интернете образуют связку WebSocket+Ajax,

Первая причина. Чаще всего уже есть сервер, который имеет какой-то rest api и тут приходит необходимость в нотификациях или что-то подобное, вот и прикручивают ws справа.

Вторая. Вебсокет немного сложнее чем http. Надо учитывать, как шарить вызовы между инстансами сервера, ведь вебсокет может жить очень долго, в отличии от http, который выполняется не больше минуты. А так же учитывать блокировку, если какой-то метод залочит поток в котором обрабатываеся вызов, то будет большая беда. Поэтому вызовы при обработке должны быть неблокирующими(suspend, async, etc) или выполнять каждое действие в отдельном потоке, но тут потоков не хватит, да и дорого потоки плодить. В общем зависит от среды выполнения.

Третья. Формат сообщения. В вебсокете не предусмотрен какой-то один формат сообщения, каждый должен выбрать его сам. Это или json-rpc или grpc или graphql или что-то подобное, что явно говорит, что ваш вызов №X завершился с результатом Y. В противовес http, который имеет параметры и какой-то ответ на эти праметры. Один, всегда.

Четвертое. сопутствующие проблемы инфраструктуры. Часто используется nginx, и в проде вы подключаетесь не к своему(им) http серверу, а к nginx, который и держит соединение. Если отваливается одна из сторон, то вторая об этом никак не узнает сразу(а иногда и вовсе) Это решается настройкой nginx, требует знаний, в противовес http, где по умолчанию настройки минимальны. Отсюда проблема пингов и понгов, они есть в протоколе, но ими невозможно управлять из браузера. Люди просят API чтоб можно было хоть как-то обработать или pong или отправить ping, но увы и ах, этого нет. Поэтому появляются такие реализации как socket.io где ребята запихали свои самописные пинги.

Как я уже сказал, ws сложнее чем http, но не столь критично, некоторые сложности опустил в виду того, что они зависят уже от инструментов реализации, ну или просто забыл. Ну и на ваш вопрос мало ответов, потому что как вы могли заметить тема оооочень обширная.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@LittleHome Автор вопроса
Как понимаю вряд ли мне кто-то ответит уже, жалко, видимо вопрос слишком уж специфичен... Вообщем по итогам моё решение было не городить не совсем понятно зачем отдельно WS отдельно Ajax, а перекинуть всю работу на WS, где для каждого сервиса моего ресурса, будет WS-воркер. Они в свою очередь построены на ООП таким образом что наследуют родительский класс который передает им методы открытия воркера, приема и рассылки сообщений + немного по специфике сервиса, понимать куда нужно отправлять то или иное сообщение юзера и пр.
Надеюсь помогу кому-нибудь. Сам себе я уже помог))
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы