Зачем использовать AJAX, когда доступны WebSockets?

Я уже давно использую WebSockets, я решил создать инструмент управления Agile для моего проекта в прошлом году в университете, используя сервер узлов и WebSockets. Я обнаружил, что использование WebSockets обеспечивает 624% -ное увеличение количества запросов в секунду, которое может обрабатывать мое приложение.

Однако с момента запуска проекта я читал о лазейках безопасности и некоторых браузерах, которые по умолчанию отключили WebSockets ..

Это приводит меня к вопросу:

Зачем использовать AJAX, когда WebSockets, похоже, делает такую ​​большую работу по снижению латентности и ресурса, есть ли что-то, что AJAX делает лучше, чем WebSockets?

WebSockets не предназначен для замены AJAX и не является строго заменой Comet / long-poll (хотя есть много случаев, когда это имеет смысл).

objectiveю WebSockets является предоставление низкозатратного, двунаправленного, полнодуплексного и долговременного соединения между браузером и сервером. WebSockets открывает новые приложения для приложений браузера, которые не были действительно возможны с использованием HTTP и AJAX (интерактивные игры, динамические медиаstreamи, мосты для существующих сетевых протоколов и т. Д.).

Однако между WebSockets и AJAX / Comet существует определенное совпадение. Например, когда браузер хочет получать уведомления о событиях сервера (например, push), то методы Comet и WebSockets, безусловно, являются жизнеспособными вариантами. Если вашему приложению нужны события с малой задержкой, это будет фактором в пользу WebSockets. С другой стороны, если вам нужно сосуществовать с существующими инфраструктурами и развернутыми технологиями (OAuth, RESTful API, прокси, балансировщики нагрузки), то это будет фактором в пользу методов комет (на данный момент).

Если вам не нужны конкретные преимущества, предоставляемые WebSockets, то, вероятно, лучше придерживаться существующих технологий, таких как AJAX и Comet, поскольку это позволяет вам повторно использовать и интегрировать с огромной существующей экосистемой инструментов, технологий, механизмов безопасности , базы знаний (т.е. гораздо больше людей в stackoverflow знают HTTP / Ajax / Comet, чем WebSockets) и т. д.

С другой стороны, если вы создаете новое приложение, которое просто не работает в рамках ограничений времени ожидания и подключения HTTP / Ajax / Comet, рассмотрите возможность использования WebSockets.

Кроме того, некоторые ответы указывают на то, что одним из недостатков WebSockets является ограниченный / смешанный сервер и поддержка браузера. Позвольте мне немного рассказать об этом. В то время как iOS (iPhone, iPad) по-прежнему поддерживает старый протокол (Hixie), большинство серверов WebSockets поддерживают как Hixie, так и версию HyBi / IETF 6455 . Большинство других платформ (если они еще не имеют встроенной поддержки) могут получить поддержку WebSockets через web-socket-js (Flash-полис). Это охватывает подавляющее большинство веб-пользователей. Кроме того, если вы используете Node для серверного бэкэнд, тогда рассмотрите возможность использования Socket.IO, который включает в себя веб-сокет-js как резерв, и если даже это не доступно (или отключено), тогда оно вернется к использованию любой техники Comet ansible для данного браузера.

Обновление : iOS 6 теперь поддерживает текущий стандарт HyBi / IETF 6455.

Ускоренный переход к декабрю 2017 года, Websockets поддерживаются (практически) каждым браузером, и их использование очень распространено.

Однако это не означает, что Websockets удалось заменить AJAX, по крайней мере, не полностью, особенно, поскольку адаптация HTTP / 2 находится на подъеме.

Короткий ответ заключается в том, что AJAX по-прежнему отлично подходит для большинства приложений REST, даже при использовании Websockets. Но бог в деталях, поэтому …:

AJAX для опроса?

Использование AJAX для опроса (или длительный опрос) вымирает (и должно быть), но оно по-прежнему используется по двум причинам (главным образом для небольших веб-приложений):

  1. Для многих разработчиков AJAX проще кодировать, особенно когда речь идет о кодировании и разработке бэкэнд.

  2. С помощью протокола HTTP / 2 была отменена самая высокая стоимость, связанная с AJAX (создание нового соединения), что позволяет AJAX-звонкам быть достаточно эффективными, особенно для публикации и загрузки данных.

Однако продвижение Websocket намного превосходит AJAX (нет необходимости повторно аутентифицировать или пересылать заголовки, не нужно «без данных» и т. Д.). Это обсуждалось несколько раз.

AJAX для ОТДЫХА?

Лучшее использование для AJAX – это вызовы API REST. Это использование упрощает базу кода и предотвращает блокировку соединения с Websocket (особенно при загрузке данных среднего размера).

Существует ряд веских причин предпочесть AJAX для вызовов API REST и загрузки данных:

  1. API AJAX был практически разработан для вызовов REST API, и это очень удобно.

  2. REST-вызовы и закачки с использованием AJAX значительно проще кодировать, как на клиенте, так и на бэкэнд.

  3. По мере увеличения полезной нагрузки данных соединения Websocket могут блокироваться, если не закодирована логика fragmentации / мультиплексирования сообщений.

    Если загрузка выполняется в одном вызове send Websocket, она может блокировать stream Websocket до завершения загрузки. Это снизит производительность, особенно на более медленных клиентах.

В общем дизайне используются небольшие сообщения bidi, передаваемые через Websockets, в то время как REST и загрузка данных (клиент к серверу) используют удобство использования AJAX для предотвращения блокировки Websocket.

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

Например, загрузка на основе Websocket может предложить возможность возобновления больших загрузок после того, как соединение будет удалено и восстановлено (помните, что 5 ГБ фильм вы хотели загрузить?).

Кодируя логику fragmentации загрузки, легко возобновить прерванную загрузку (сложная часть кодировала вещь).

Как насчет HTTP / 2 push?

Вероятно, я должен добавить, что функция push / HTTP не заменяет (и, вероятно, не может) заменять Websockets.

Это обсуждалось здесь раньше, но достаточно упомянуть, что одно соединение HTTP / 2 обслуживает весь браузер (все вкладки / windows), поэтому данные, которые толкаются по протоколу HTTP / 2, не знают, к какой вкладке / окну принадлежит, устраняя его способность заменить способность Websocket передавать данные непосредственно на конкретную вкладку / окно браузера.

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

И безопасность?

Ну, как правило, чем больше доверия и контроля предлагается программисту, тем мощнее инструмент … и тем больше проблем с безопасностью, которые ползут.

AJAX по своей природе будет иметь верх, так как безопасность встроена в код браузера (что иногда вызывает сомнения, но оно все еще существует).

С другой стороны, вызовы AJAX более восприимчивы к атакам «человек в середине», в то время как проблемы безопасности Websockets обычно являются ошибками в коде приложения, который вводит ошибку безопасности (обычно логика проверки подлинности – это где вы найдете их).

Лично я не считаю, что это большая разница, если что-то мне кажется, что Websockets немного лучше, особенно когда вы знаете, что делаете.

Мое скромное мнение

IMHO, я бы использовал Websockets для всего, кроме вызовов REST API. Большие загрузки данных Я бы fragmentировал и отправлял через Websockets, когда это было возможно.

Опрос, IMHO, должен быть объявлен вне закона, стоимость сетевого трафика ужасна, а Push Websocket достаточно легко справиться даже для новых разработчиков.

Помимо проблем со старыми браузерами (включая IE9, поскольку WebSockets будет поддерживаться, начиная с IE10), по-прежнему возникают большие проблемы с сетевыми посредниками, которые еще не поддерживают WebSockets, включая прозрачные прокси, обратные прокси и балансировки нагрузки. Есть некоторые мобильные операторы, которые полностью блокируют трафик WebSocket (т. Е. После команды HTTP UPGRADE).

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

Большинство жалоб, которые я прочитал о веб-сайтах и ​​безопасности, принадлежат производителям безопасности средств безопасности веб-браузера и средств безопасности брандмауэра. Проблема в том, что они не знают, как выполнять анализ безопасности трафика веб-сайтов, поскольку после того, как он выполнил обновление с HTTP на бинарный протокол websocket, содержимое пакета и его значение специфичны для приложений (на основе того, что вы программируете). Это, очевидно, логический кошмар для этих компаний, средства к существованию которых основаны на анализе и classификации всего вашего интернет-трафика. 🙂

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

Я не думаю, что мы можем сделать четкое сравнение Websockets и HTTP, поскольку они не являются конкурентами и не решают одни и те же проблемы.

Websockets – отличный выбор для обработки долговременной двунаправленной streamовой передачи данных почти в режиме реального времени, тогда как REST отлично подходит для случайных сообщений. Использование websockets – это значительная инвестиция, поэтому она является излишним для случайных подключений.

Вы можете обнаружить, что Websockets лучше, когда присутствуют высокие нагрузки, HTTP в некоторых случаях немного быстрее, потому что он может использовать кеширование. Сравнение REST с Websockets похоже на сравнение яблок с апельсинами.

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

Пример различий между HTTP и Websockets в виде библиотеки размера клиента, которая может обрабатывать конечную точку Websocket, такую ​​как REST API и конечные точки RESTful, такие как Websockets на клиенте. https://github.com/mikedeshazer/sockrest Также для тех, кто пытается использовать API-интерфейс websocket на клиенте или наоборот, как они привыкли. Файл libs / sockrest.js в значительной степени позволяет понять различия (или, скорее, предполагается).

  • Как ускорить запуск Java VM (JVM)?
  • Производительность Cellfun и Simple Matlab Loop
  • Производительность C ++ по сравнению с Java / C #
  • Отсутствие повышения производительности после использования openMP в программе оптимизируется для последовательного запуска
  • Производительность dynamic_cast?
  • Как влияет динамическая переменная на производительность?
  • почему GCC __builtin_prefetch не улучшает производительность?
  • Что лучше использовать в PHP $ array = $ value или array_push ($ array, $ value)?
  • Производительность селектора jQuery с контекстом
  • Ускорьте работу цикла в R
  • Почему putImageData так медленно?
  • Давайте будем гением компьютера.