Перевод статьи Джона Мюллера — What Is a WebSockets Push-Styled API and How Does It Work?
Технологии отправки уведомлений от сервера к клиенту (пуш-технологии) должны покрывать различный набор данных и потребностей пользователей. В первой и второй части серии (ссылки на оригинал, прим.) обсуждались методы обеспечения обмена данными между серверами в реальном времени, при которых клиенты получали обновления данных постфактум (не в режиме реального времени, прим.). Однако, иногда требуется отправить данные от сервера к клиенту, в режиме реального времени, и тут пригодятся веб-сокеты (WebSockets). В данной статье обсуждаются возможности веб-сокетов и их отличие от остальных пуш-технологий.
Что такое веб-сокет?
Веб-сокеты позволяют клиенту установить такое соединение с сервером, при котором данные будут приходить при возникновении серверного события (event-driven) в режиме реального времени. В отличие от множества веб-технологий, веб-сокеты не следуют стратегии «Запрос-ответ», при которой соединение открывается для выполнения запроса, и закрывается сразу после его выполнения. Веб-сокеты держат соединение открытым. Следовательно, клиенту не требуется постоянно опрашивать (poll) сервер на предмет наличия обновлений, что значительно ускоряет быстродействие приложения при меньшем расходе ресурсов. Веб-сокет состоит из следующих частей:
- Клиент (Client): делает запрос к серверу с целью получения определенных данных.
- Портал веб-сокета (Websocket Gateway): является интерфейсом между клиентом и сервером.
- Сервер (Server): Отсылает обновления клиенту через портал веб-сокета, в режиме реального времени.
Смысл веб-сокета — предоставить альтернативу HTTP-соединению, в виде TCP-соединения. Первоначальный запрос клиента выполняется с помощью HTTP, в котором указывается заголовок для смены (upgrade) протокола, и всё последующее взаимодействие выполняется с помощью протокола веб-сокетов (WS protocol). Другими словами, вместо отправки запроса к http://<чего-нибудь>, происходит отправка к ws://<чего-нибудь>. Данная техника достигает следующих целей:
- Передается только важная информация, без дополнительной нагрузки в виде HTTP-заголовков, что экономит ресурсы и открывает возможность для взаимодействия в реальном времени.
- Создается полноценный дуплекс-канал, при котором отпадает необходимость в таких стратегиях как «опрос» (polling) и «запрос-ответ» (request/response). Как клиент, так и сервер, могут отдавать данные в любой момент. Также, сокращается объем сетевого трафика, что повышает производительность приложения путем сокращения задержки ответа, которая обычно возникает в веб-взаимодействиях.
- Использование единственного TCP-соединения сокращает потребление ресурсов.
- Поддержка открытого TCP-соединения открывает возможность передачи данных в виде потока (streaming).
Также, веб-сокеты превосходят ограничения существующих технологий:
- Опрос (polling): периодически выполняющийся цикл запросов на стороне клиента с целью получить данные от сервера, даже при отсутствии таковой на сервере. Тратится огромное количество ресурсов впустую.
- HTTP потоки (HTTP streaming): несмотря на то что соединение остается открытым всё время, использование стандартных HTTP-заголовков увеличивает размер передаваемых данных и снижает производительность.
- Асинхронный JavaScript и XML (AJAX): полагается на такой объект JavaScript как XmlHttpRequest ради подмены части страницы, если это потребуется в результате обновления данных. Аналогично, HTTP-заголовки повышают размер передаваемых данных, а взаимодействие через полу-дуплекс требует больше TCP каналов, и когда Веб-сервер отправляет данные отдельным клиентам — тратится больше ресурсов.
Для использования веб-сокетов требуются совместимые браузеры, в список которых входят также: Chrome, Edge, Firefox, Internet Explorer, Opera, и Safari (см. caniuse, прим. переводчика). Потребность в совместимом браузере ограничивает пользу от веб-сокетов (однако, это ограничение незначительно пока нет необходимости в поддержке большого количества пользователей со старыми браузерами).
Хоть и данная статья рассказывает, в основном, о взаимодействии браузера с сервером через веб-сокеты, есть также возможность веб-сокетного взаимодействия между серверами; клиенты для веб-сокета доступны для большинства основных серверных платформ: Node.js, PHP, Python, Ruby, .NET, и Java.
Автор: диванный аналитик