Long Polling VS Server-Sent Events VS WebSocket

Теория

Частые опросы

Самый простой способ получать новую информацию от сервера – периодический опрос. То есть, регулярные запросы на сервер вида: «Привет, я здесь, у вас есть какая-нибудь информация для меня?». Например, раз в 10 секунд.

В ответ сервер, во-первых, помечает у себя, что клиент онлайн, а во-вторых посылает весь пакет сообщений, накопившихся к данному моменту.

Это работает, но есть и недостатки:

  1. Сообщения передаются с задержкой до 10 секунд (между запросами).
  2. Даже если сообщений нет, сервер «атакуется» запросами каждые 10 секунд, даже если пользователь переключился куда-нибудь или спит. С точки зрения производительности, это довольно большая нагрузка.

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

Длинные опросы

«Длинные опросы» – гораздо лучший способ взаимодействия с сервером.

Они также очень просты в реализации, и сообщения доставляются без задержек.

Как это происходит:

  1. Запрос отправляется на сервер.
  2. Сервер не закрывает соединение, пока у него не возникнет сообщение для отсылки.
  3. Когда появляется сообщение – сервер отвечает на запрос, посылая его.
  4. Браузер немедленно делает новый запрос.

Сравнение

Long Polling — это технология, которая позволяет получать данные о новых событиях с помощью «длинных запросов». Сервер получает запрос, но отправляет ответ на него не сразу, а лишь тогда, когда произойдет какое-либо событие (например, придёт новое сообщение), либо истечет заданное время ожидания.

SSE (от англ. Server-Sent Events — «события, посылаемые сервером») представляет собой технологию отправки уведомлений от сервера к веб-браузеру в виде DOM-событий. Технология Server-Sent Events сейчас стандартизируется как часть HTML5[1] организацией W3C.

WebSocket — протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером, используя постоянное соединение. В настоящее время в W3C осуществляется стандартизация API Web Sockets. Черновой вариант стандарта этого протокола утверждён IETF.

Плюсы и минусы

Long Polling

Плюсы:

  • поддерживается всеми устройствами и не требует поддержки fallback реализаций

Минусы:

  • из-за ограничений на стороне сервера по времени жизни обычного соединения, оно может быть закрыто ещё до получения данных
  • после получения данных, соединение закрывается и требуется открыть новое соединение, что требует дополнительных ресурсов и накладывает свой оверхэд
  • ограничение в кол-ве одновременно открытых соединений. Как правило 5-6 на браузер (неактуально если используется HTTP/2 ?)

SSE

Плюсы:

  • создаёт постоянное соединение
  • встроенная поддержка переподключения клиента при разрыве соединения
  • может быть заменён JS полифилами в браузерах, где нет поддержки
  • Отсутствие блокировки брандмауэром

Минусы:

  • транспорт бинарных данных отсутствует, только текст
  • однонаправленное соединение
  • ограничение в кол-ве одновременно открытых соединений. Как правило 5-6 на браузер (неактуально если используется HTTP/2)

WebSocket

Плюсы:

  • Эффективность использования ресурсов (при передаче данных не передаются заголовки)
  • обеспечивает полнодуплексное двунаправленное соединение
  • поддерживает как обычный текст, так и бинарные данные

Минусы:

  • поддержка fallback реализаций, в браузерах без поддержки WebSocket
  • Блокировка брандмауэром. Некоторые корпоративные брандмауэры с проверкой пакетов испытывают проблемы с работой WebSockets (особенно SophosXG Firewall, WatchGuard и McAfee Web Gateway).
  • Нет встроенной поддержки переподключения клиента при разрыве соединения

Готовые решения или самописные

Решение 1

Самописный сервис, написанный на go-app-boilerplate

Плюсы:

  • знаем как работает
  • оперативное внесение правок
  • разработка под себя и свои нужды

Минусы:

  • время на разработку
  • необходимость самостоятельного решения проблем производительности, контроля активности соединений, проблем утечек памяти

Решение 2

Open source сервис Centrifugo. Сервис написан на Go

Плюсы:

  • большое комьюнити
  • поддержка нескольких типов протоколов (SSE, WebSockets, HTTP streaming)
  • добавление новых типов протоколов
  • js sdk, позволяющий "мягко" переключаться между протоколами
  • поддержка HTTP/2
  • экспериментальная поддержка HTTP/3 (WebTransport)
  • наличие готового симфони бандла (https://github.com/fre5h/CentrifugoBundle)
  • возможность досылки сообщений после разрыва и восстановления соединения

Минусы:

  • стороннее решение
  • написание отдельного backend слоя для отправки уведомлений в сервис

Решение 3

Open source сервис Mercure.rocks Hub. Сервис написан на Go

Плюсы:

  • большое комьюнити
  • поддержка HTTP/2
  • наличие готового симфони бандла реализующего отправку событий в Mercure

Минусы:

  • стороннее решение
  • написание отдельного backend слоя для отправки уведомлений в сервис
  • поддерживает только один протокол mercure (поверх нативного SSE)

11.09.2021 07:08

Комментарии

Комментариев пока нет.


Copyrights © 2007 - 2026 YaPro.Ru