[Перевод] WebSockets и длинный опрос

задняя часть Программа перевода самородков WebSocket

WebSockets 与长轮询的较量

Как мы выбираем между ними?

Иногда, когда информация готова, нам нужно получить ее с сервера. И шаблон запроса/ответа AJAX, который мы обычно используем, не может поддерживать соединение запроса, установленное для таких сценариев приложений. Вместо этого нам нужен подход на основе push-уведомлений, такой как протокол WebSockets, долгий опрос, события Server Push Events (SSE) и совсем недавно HTTP2 Server Push. В этой статье мы сравним два подхода: WebSockets и Long Polling.

Обзор длинного опроса

1995 год,НетскейпБрендан Эйх был нанят для реализации возможностей сценариев для Netscape Navigator, и через 10 дней родился JavaScript. Как язык программирования, JavaScript родился с очень ограниченной функциональностью по сравнению с современным языком JavaScript, а его взаимодействие с объектной моделью документа (DOM) браузера было еще более ограниченным. JavaScript в основном используется для предоставления ограниченных улучшений, повышающих удобство использования документов браузера. Например, проверка форм в браузере, легкая вставка динамического HTML в существующие документы.

вместе сбраузерные войныС наступлением жары версия Internet Explorer от Microsoft достигла версии 4 и выше, битва за мощный набор функций браузера заставила Microsoft представить новую функцию в Internet Explorer, которая в конечном итоге сталаXMLHttpRequest. XMLHttpRequest обычно поддерживается всеми браузерами уже более десяти лет.

долгий опросПо сути, это более эффективная форма исходного метода опроса. Отправка дублирующих запросов на сервер — пустая трата ресурсов, потому что для каждого нового входящего запроса должно быть установлено соединение, должны быть проанализированы HTTP-заголовки запроса, должен быть выполнен запрос новых данных, а ответ должен быть сгенерирован и доставлен (обычно новых данных не приводится) ). Затем соединение должно быть закрыто, а все ресурсы очищены. Долгий опрос – это метод, при котором сервер предпочитает держать клиентское соединение открытым как можно дольше, предоставляя ответ только после того, как данные станут доступны или будет достигнуто пороговое значение тайм-аута, а не до тех пор, пока новые данные не будут доступны клиенту. повторные запросы несколько раз.

Обзор веб-сокетов

Примерно в середине 2008 года разработчикMichael CarterиIan HicksonОсобенно остро осознаю боль и ограничения использования Comet при реализации чего-то действительно надежного. пройти черезв IRCиСписок рассылки W3Cсотрудничества они разработали план по внедрению в сети нового стандарта современной двусторонней связи в режиме реального времени, тем самымпридумал название «WebSocket».

Эта идея вошла в проект стандарта W3C HTML, и вскоре после этого Майкл Картер написал статью:Представлены WebSockets в сообществе Comet.. В 2010 году Google Chrome 4 стал первым браузером, полностью поддерживающим WebSockets, и другие поставщики браузеров последовали его примеру в течение следующих нескольких лет. 2011 год,RFC 6455 — протокол веб-сокетов- Опубликовано на веб-сайте IETF.

короче,WebSocketsэто встроенное устройствоTCP/IPТранспортный уровень над стеком протоколов. Его цель — предоставить веб-разработчикам коммуникационный уровень TCP, максимально приближенный к исходному по своей природе, с добавлением некоторых абстракций для устранения некоторого сопротивления, которое существует при работе в Интернете. Они также учитывают тот факт, что сети имеют дополнительные соображения безопасности, которые необходимо учитывать для защиты потребителей и поставщиков услуг.

Плюсы и минусы длительного опроса

преимущество

  • Длинный опрос реализуется после XMLHttpRequest и почти повсеместно поддерживается устройствами, поэтому дополнительные альтернативы обычно не требуются. Однако в тех случаях, когда необходимо обрабатывать исключения или когда сервер может запрашивать новые данные, но не поддерживает длительный опрос (не говоря уже о других более современных технических стандартах), базовый опрос все еще иногда полезен, и можно использовать XMLHttpRequest или воспользуйтесь преимуществами простых тегов HTML-скрипта через JSONP.

недостаток

  • Длительный опрос потребляет много ресурсов сервера.
  • Надежный порядок сообщенийМожет возникнуть проблема с длительным опросом, так как несколько HTTP-запросов от одного клиента могут выполняться одновременно. Например, если у клиента открыты две вкладки браузера, использующие одни и те же ресурсы сервера, а клиентское приложение сохраняет данные в локальном хранилище (таком как localStorage или IndexedDb), нет гарантии, что повторяющиеся данные не будут записаны несколько раз. .
  • В зависимости от реализации сервера подтверждение получения сообщения одним клиентом может также привести к тому, что другой клиент вообще не получит ожидаемое сообщение, поскольку сервер может ошибочно полагать, что клиент получил ожидаемые данные.

Плюсы и минусы веб-сокетов

преимущество

  • Веб-сокеты поддерживают уникальное соединение открытым, устраняя при этом проблемы с задержкой, связанные с длительным опросом.
  • WebSockets обычно не используют XMLHttpRequest, поэтому нам не нужно отправлять заголовки каждый раз, когда нам нужно получить дополнительную информацию с сервера. Это, в свою очередь, снижает штраф за высокую загрузку данных при отправке данных на сервер.

недостаток

  • Веб-сокеты не могут автоматически возобновлять соединения, когда соединение разрывается — это та часть, которую вам нужно реализовать самостоятельно, и это вызывает множество проблем.клиентская библиотекапричина.
  • Браузеры старше 2011 года не могут поддерживать соединения WebSocket, но это становится все более неуместным.

Почему протокол WebSocket лучше?

Как правило, WebSockets будет лучшим выбором.

Длительный опрос занимает больше ресурсов на сервере, а WebSockets занимает очень мало места на сервере. Долгий опрос также требует многократного обмена данными между сервером и многими устройствами. Различные шлюзы имеют разные критерии того, как долго обычное соединение может оставаться открытым. Если соединение открыто слишком долго, его процесс может быть уничтожен, даже если процесс выполняет что-то важное.

Причины для создания приложений с WebSockets:

  • Полнодуплексный асинхронный обмен сообщениями. Другими словами, и клиент, и сервер могут передавать сообщения друг другу независимо друг от друга.
  • Веб-сокеты могут проходить через большинство брандмауэров без какой-либо настройки.
  • Хороший безопасный режим (на основе оригинального безопасного режима).

Решение WebSockets с открытым исходным кодом

Существует две основные категории библиотек WebSocket: те, которые реализуют только часть протокола, а остальное оставляют на усмотрение разработчика, и те, которые построены поверх протокола и имеют различные дополнительные функции, которые обычно требуются приложениям обмена сообщениями в реальном времени, например как восстановление соединения при потере, публикация/подписка на каналы, аутентификация, авторизация и т. д.

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

Начнем с первой категории.

Примечание. Все перечисленные ниже библиотеки являются открытыми исходными кодами.

ws

ws— это «простой в использовании, быстрый и полностью протестированный клиент WebSocket и сервер Node.js». Это определенно базовая реализация, предназначенная для выполнения всей тяжелой работы по выполнению протокола, но дополнительные функции, такие как восстановление соединений, публикация/подписка и т. д., должны управляться вами.

Клиент (браузер до привязки):

const WebSocket = require('ws');
const ws = new WebSocket('ws://www.host.com/path');
ws.on('open', function open() {
    ws.send('something');
});

ws.on('message', function incoming(data) {
    console.log(data);
});

Сервер (Node.js):

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
    ws.on('message', function incoming(message) {
    console.log('received: %s', message);
    });
    ws.send('something');
});

μWebSockets

μWSдаwsВ качестве замены он уделяет особое внимание производительности и стабильности. Насколько мне известно, µWS находится в одном шаге от самого быстрого сервера WebSocket.SocketClusterОн управляется им, о SocketCluster я расскажу ниже.

Недавно вокруг µWS возникли разногласия, поскольку авторы попытались извлечь µWS из NPM по философским причинам, но последняя работоспособная версия µWS все еще находится в NPM и может быть явно указана при установке из NPM. То есть автор разрабатываетновая версия, который поставляется спривязки node.jsтакжеВ развитие.

var WebSocketServer = require('uws').Server;
var wss = new WebSocketServer({ port: 3000 });
function onMessage(message) {
    console.log('received: ' + message);
}

wss.on('connection', function(ws) {
    ws.on('message', onMessage);
    ws.send('something');
});

Клиент — использование WebSockets в браузере

API WebSocket определен вWHATWG HTML Living Standard, это очень просто в использовании. Для создания WebSocket требуется всего одна строка кода:

JS

const ws = new WebSocket('ws://example.org');

Обратите внимание, что ws используется там, где обычно используется схема HTTP. Там, где обычно используется схема https, доступен и wss. Эти протоколы были введены в спецификации WebSocket для представления HTTP-соединения, которое включает запрос на обновление соединения для использования WebSockets.

Создание объекта WebSocket само по себе мало что делает. Соединение устанавливается асинхронно, поэтому перед отправкой каких-либо сообщений вы должны прослушать завершение рукопожатия, а также вам нужен слушатель, который получает сообщения от сервера:

ws.addEventListener('open', () => {
    // 向 WebSocket 服务器发送消息
    ws.send('Hello!');
});

ws.addEventListener('message', event => {
// `event` 对象是一个典型的 DOM 事件对象,
// 服务器发送的消息数据存储在 `data` 属性中
    console.log('Received:', event.data);
});

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

Длинный опрос — решение с открытым исходным кодом

Большинство библиотек не будут использовать длительный опрос отдельно, потому что длительный опрос часто используется с другими транспортными стратегиями, или в качестве альтернативы другим транспортным стратегиям, или в качестве резервной копии, когда длительный опрос не работает. В 2018 году и позже автономные библиотеки для длинных опросов были особенно редки, а метод длинных опросов быстро потерял актуальность перед лицом широкой поддержки транспорта более продвинутыми альтернативами. Однако вы можете использовать его как альтернативу передаче, вот несколько вариантов на разных языках:

Умело, WebSockets и Long Polling

самыйSDK клиентской библиотеки AblyиспользоватьWebSocketУстановите живое соединение с Ably, а затем используйте простые HTTP-запросы для всех остальных операций REST, включая аутентификацию.

Однако SDK клиентской библиотеки (например, нашБиблиотека браузера Javascript) предназначен для выбора доступного и наилучшего метода транспортировки на основе доступных браузеров и подключений. Поддерживая дополнительные транспорты, которые возвращаются к самому низкому общему стандарту, Ably гарантирует, что почти все современные браузеры могут установить живое соединение с Ably. Наша библиотека браузера Javascript в настоящее время поддерживает следующие транспорты, в порядке производительности от лучшего к худшему:

При реализации поддержки WebSockets с длительным опросом в качестве альтернативы необходимо охватить множество аспектов — не только детали реализации клиента и сервера, но и поддержку других транспортов для обеспечения совместимости с различными клиентскими средами. проблемы, такие какАутентификация и авторизация,Гарантированная доставка сообщений,Надежный порядок сообщений,Сохранение истории сообщенийбольше аспектов.

Ссылки и дополнительная литература

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.