В каких ситуациях длинный / короткий опрос AJAX предпочтительнее HTML5 WebSockets?

253

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

В настоящее время я реализую это с помощью простого AJAX, но это имеет недостаток в том, что вы регулярно нажимаете на сервер, когда истекает короткий таймер.

При исследовании длинного/короткого опроса я столкнулся с WebSockets HTML5. Это кажется простым в использовании, но я не уверен, есть ли какие-то скрытые недостатки. Например, я думаю, что WebSockets поддерживается только некоторыми браузерами. Существуют ли другие неудобства для WebSockets, о которых я должен знать?

Так как кажется, что обе технологии делают то же самое, в каких сценариях вы предпочитаете использовать один над другим? Более конкретно, имеет ли HTML5 WebSockets устаревший AJAX длинный/короткий опрос, или есть ли веские причины предпочесть AJAX через WebSockets?

Теги:
websocket
network-protocols

3 ответа

455
Лучший ответ

WebSockets - это определенно будущее.

Длительный опрос - это грязное обходное решение для предотвращения создания соединений для каждого запроса, например AJAX, но длительный опрос был создан, когда WebSockets не существовало. Теперь из-за WebSockets, длительный опрос уходит.

WebRTC позволяет осуществлять одноранговую связь.

Я рекомендую изучать WebSockets.

Сравнение:

различных методов связи в Интернете

  • AJAX - requestresponse. Создает соединение с сервером, отправляет заголовки запросов с дополнительными данными, получает ответ от сервера и закрывает соединение. Поддерживается во всех основных браузерах.

  • Длительный опрос - requestwaitresponse. Создает соединение с сервером, например, AJAX, но поддерживает соединение keep-alive в течение некоторого времени (хотя и недолго). Во время подключения открытый клиент может получать данные с сервера. Клиент должен повторно подключаться после закрытия соединения из-за тайм-аутов или данных. На стороне сервера он по-прежнему обрабатывается как HTTP-запрос, такой же, как AJAX, за исключением того, что ответ по запросу произойдет сейчас или некоторое время в будущем, определяемое логикой приложения. график поддержки (полный) | wikipedia

  • WebSockets - client & harr; server. Создайте TCP-соединение с сервером и держите его открытым до тех пор, пока это необходимо. Сервер или клиент могут легко закрыть соединение. Клиент проходит через процесс установления подлинности, совместимый с HTTP. Если это удастся, сервер и клиент могут в любой момент обмениваться данными в обоих направлениях. Это эффективно, если приложение требует частого обмена данными в обоих направлениях. У WebSockets есть фреймворк данных, который включает маскирование для каждого сообщения, отправленного с клиента на сервер, поэтому данные просто зашифровываются. график поддержки (очень хорошо) | wikipedia

  • WebRTC - peer & harr; peer. Транспорт для установления связи между клиентами и транспортно-агностик, поэтому он может использовать UDP, TCP или даже более абстрактные слои. Обычно это используется для передачи больших объемов данных, таких как потоковая передача видео/аудио, где надежность является вторичной, а несколько кадров или снижение качества прогрессирования могут быть принесены в жертву в ответ на время отклика и, по крайней мере, на некоторую передачу данных. Обе стороны (сверстники) могут подталкивать данные друг к другу независимо друг от друга. Хотя он может использоваться полностью независимо от любых централизованных серверов, он по-прежнему требует некоторого способа обмена данными о конечных точках, где в большинстве случаев разработчики по-прежнему используют централизованные серверы для "соединения" одноранговых узлов. Это необходимо только для обмена важными данными для установления соединения, после чего не требуется централизованный сервер. график поддержки (средний) | wikipedia

  • События с сервером - client & larr; server. Клиент устанавливает постоянное и долгосрочное подключение к серверу. Только сервер может отправлять данные клиенту. Если клиент хочет отправить данные на сервер, для этого потребуется использование другой технологии/протокола. Этот протокол совместим с HTTP и прост в применении на большинстве серверных платформ. Это предпочтительный протокол, который будет использоваться вместо Long Polling. график поддержки (хорошо, кроме IE) | wikipedia

Преимущества:

Основное преимущество WebSockets на стороне сервера заключается в том, что это не HTTP-запрос (после установления связи), а правильный протокол связи на основе сообщений. Этот позволяет достичь огромных преимуществ по производительности и архитектуре.. Например, в node.js вы можете использовать одну и ту же память для разных подключений сокетов, чтобы каждый из них мог использовать общие переменные. Поэтому вам не нужно использовать базу данных в качестве точки обмена в середине (например, с AJAX или Long Polling с языком, подобным PHP). Вы можете хранить данные в ОЗУ или даже переиздавать между сокетами сразу.

Вопросы безопасности

Люди часто обеспокоены безопасностью WebSockets. Реальность такова, что она не имеет большого значения или даже делает WebSockets лучшим вариантом. Прежде всего, с AJAX существует более высокая вероятность MITM, так как каждый запрос представляет собой новое TCP-соединение, которое проходит через интернет-инфраструктуру. С помощью WebSockets, когда он подключается, гораздо сложнее перехватывать между ними, с дополнительной принудительной маскировкой кадров, когда данные передаются от клиента к серверу, а также дополнительное сжатие, что требует больших усилий для сбора данных. Все современные протоколы поддерживают как HTTP, так и HTTPS (зашифрованные).

P.S.

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

  • 1
    Скажите мне, если я ошибаюсь, но, хотя WebSocket предоставляет множество улучшений, он не полностью перекрывает функциональность длительного опроса. Например, вы не можете просто поменять комету на websocket для опроса REST API.
  • 15
    Дело не в совместимости. Самое главное, что он собирается полностью переосмыслить, как происходит общение. Поскольку RESTful API работают с шаблоном Request> Response, двунаправленная связь здесь будет бессмысленной. Поэтому попытка использовать WebSockets для запроса RESTful API - это немного странная попытка, и она не видит никакой выгоды от нее вообще. Если вам нужны данные из RESTful API, но в режиме реального времени, вы создаете API WebSockets для передачи данных, которые будут работать с двунаправленной связью, такой как WebSockets. Вы пытаетесь сравнить вещи под углом, что они не сопоставимы :)
Показать ещё 21 комментарий
9

Одной из конкурирующих технологий, которую вы опустили, является Server-Sent Events/Event Source. Что такое Long-Polling, Websockets, Server-Sent Events (SSE) и Comet?, хорошо обсуждают все эти проблемы. Имейте в виду, что некоторые из них легче, чем другие, интегрироваться на стороне сервера.

  • 0
    Из всего этого, что бы вы предложили изучить?
  • 0
    У меня был успех с длительным опросом, единственная хитрость (для него и других технологий) - не связывание серверного потока. Если вы не используете асинхронный код сервера, он не будет масштабироваться.
Показать ещё 1 комментарий
6

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

  • 5
    WebSockets поддерживаются каждым сервером ... Вам просто нужно установить node.js или что-то подобное.
  • 9
    Немного подправил, чтобы объяснить, что да, любой сервер будет поддерживать WebSockets. Однако, если вы используете хостинг, вы не сможете их использовать.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню