- PVSM.RU - https://www.pvsm.ru -

Клиент-серверное взаимодействие в реальном времени с помощью веб-сокетов

Перевод статьи Джона Мюллера [1]What Is a WebSockets Push-Styled API and How Does It Work? [2]

Технологии отправки уведомлений от сервера к клиенту (пуш-технологии) должны покрывать различный набор данных и потребностей пользователей. В первой [3] и второй [4] части серии (ссылки на оригинал, прим.) обсуждались методы обеспечения обмена данными между серверами в реальном времени, при которых клиенты получали обновления данных постфактум (не в режиме реального времени, прим.). Однако, иногда требуется отправить данные от сервера к клиенту, в режиме реального времени, и тут пригодятся веб-сокеты (WebSockets). В данной статье обсуждаются возможности веб-сокетов и их отличие от остальных пуш-технологий.

Что такое веб-сокет?

Веб-сокеты позволяют клиенту установить такое соединение с сервером, при котором данные будут приходить при возникновении серверного события (event-driven) в режиме реального времени. В отличие от множества веб-технологий, веб-сокеты не следуют стратегии «Запрос-ответ», при которой соединение открывается для выполнения запроса, и закрывается сразу после его выполнения. Веб-сокеты держат соединение открытым. Следовательно, клиенту не требуется постоянно опрашивать (poll) сервер на предмет наличия обновлений, что значительно ускоряет быстродействие приложения при меньшем расходе ресурсов. Веб-сокет состоит из следующих частей:

  • Клиент (Client): делает запрос к серверу с целью получения определенных данных.
  • Портал веб-сокета (Websocket Gateway): является интерфейсом между клиентом и сервером.
  • Сервер (Server): Отсылает обновления клиенту через портал веб-сокета, в режиме реального времени.

Смысл веб-сокета — предоставить альтернативу HTTP-соединению, в виде TCP-соединения. Первоначальный запрос клиента выполняется с помощью HTTP, в котором указывается заголовок для смены (upgrade) протокола, и всё последующее взаимодействие выполняется с помощью протокола веб-сокетов (WS protocol). Другими словами, вместо отправки запроса к http://<чего-нибудь>, происходит отправка к ws://<чего-нибудь>. Данная техника достигает следующих целей:

  • Передается только важная информация, без дополнительной нагрузки в виде HTTP-заголовков, что экономит ресурсы и открывает возможность для взаимодействия в реальном времени.
  • Создается полноценный дуплекс-канал [5], при котором отпадает необходимость в таких стратегиях как «опрос» (polling) и «запрос-ответ» (request/response). Как клиент, так и сервер, могут отдавать данные в любой момент. Также, сокращается объем сетевого трафика, что повышает производительность приложения путем сокращения задержки ответа, которая обычно возникает в веб-взаимодействиях.
  • Использование единственного TCP-соединения сокращает потребление ресурсов.
  • Поддержка открытого TCP-соединения открывает возможность передачи данных в виде потока (streaming).

Также, веб-сокеты превосходят ограничения существующих технологий:

  • Опрос (polling): периодически выполняющийся цикл запросов на стороне клиента с целью получить данные от сервера, даже при отсутствии таковой на сервере. Тратится огромное количество ресурсов впустую.
  • HTTP потоки (HTTP streaming): несмотря на то что соединение остается открытым всё время, использование стандартных HTTP-заголовков увеличивает размер передаваемых данных и снижает производительность.
  • Асинхронный JavaScript и XML (AJAX): полагается на такой объект JavaScript как XmlHttpRequest ради подмены части страницы, если это потребуется в результате обновления данных. Аналогично, HTTP-заголовки повышают размер передаваемых данных, а взаимодействие через полу-дуплекс [6] требует больше TCP каналов, и когда Веб-сервер отправляет данные отдельным клиентам — тратится больше ресурсов.

Для использования веб-сокетов требуются совместимые браузеры, в список которых входят также: Chrome, Edge, Firefox, Internet Explorer, Opera, и Safari (см. caniuse [7], прим. переводчика). Потребность в совместимом браузере ограничивает пользу от веб-сокетов (однако, это ограничение незначительно пока нет необходимости в поддержке большого количества пользователей со старыми браузерами).

Хоть и данная статья рассказывает, в основном, о взаимодействии браузера с сервером через веб-сокеты, есть также возможность веб-сокетного взаимодействия между серверами; клиенты для веб-сокета доступны для большинства основных серверных платформ: Node.js [8], PHP [9], Python [10], Ruby [11], .NET [12], и Java [13].

Автор: диванный аналитик

Источник [14]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/setevy-e-tehnologii/281390

Ссылки в тексте:

[1] Джона Мюллера: https://www.programmableweb.com/profile/johnjohnmuellerbookscom

[2] What Is a WebSockets Push-Styled API and How Does It Work?: https://www.programmableweb.com/news/what-websockets-push-styled-api-and-how-does-it-work/analysis/2017/04/20

[3] первой: https://www.programmableweb.com/news/what-webhooks-push-styled-api-and-how-does-it-work/analysis/2017/03/28

[4] второй: https://www.programmableweb.com/news/what-pubsubhubbub-push-styled-api-and-how-does-it-work/analysis/2017/04/03

[5] дуплекс-канал: https://ru.wikipedia.org/wiki/%D0%94%D1%83%D0%BF%D0%BB%D0%B5%D0%BA%D1%81_(%D1%82%D0%B5%D0%BB%D0%B5%D0%BA%D0%BE%D0%BC%D0%BC%D1%83%D0%BD%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8)

[6] полу-дуплекс: https://ru.wikipedia.org/wiki/%D0%94%D1%83%D0%BF%D0%BB%D0%B5%D0%BA%D1%81_(%D1%82%D0%B5%D0%BB%D0%B5%D0%BA%D0%BE%D0%BC%D0%BC%D1%83%D0%BD%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8)#%D0%9F%D0%BE%D0%BB%D1%83%D0%B4%D1%83%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC

[7] caniuse: https://caniuse.com/#feat=websockets

[8] Node.js: http://codular.com/node-web-sockets

[9] PHP: http://www.phpbuilder.com/articles/application-architecture/optimization/creating-real-time-applications-with-php-and-websockets.html

[10] Python: https://www.fullstackpython.com/websockets.html

[11] Ruby: http://blog.honeybadger.io/building-a-simple-websockets-server-from-scratch-in-ruby/

[12] .NET: http://www.codemag.com/article/1210051

[13] Java: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/HomeWebsocket/WebsocketHome.html

[14] Источник: http://habrahabr.ru/sandbox/115814/