Самый простой способ получать новую информацию от сервера – периодический опрос. То есть, регулярные запросы на сервер вида: «Привет, я здесь, у вас есть какая-нибудь информация для меня?». Например, раз в 10 секунд.
В ответ сервер, во-первых, помечает у себя, что клиент онлайн, а во-вторых посылает весь пакет сообщений, накопившихся к данному моменту.
Это работает, но есть и недостатки:
Сообщения передаются с задержкой до 10 секунд (между запросами).
Даже если сообщений нет, сервер «атакуется» запросами каждые 10 секунд, даже если пользователь переключился куда-нибудь или спит. С точки зрения производительности, это довольно большая нагрузка.
Так что, если речь идёт об очень маленьком сервисе, подход может оказаться жизнеспособным, но в целом он нуждается в улучшении.
«Длинные опросы» – гораздо лучший способ взаимодействия с сервером.
Они также очень просты в реализации, и сообщения доставляются без задержек.
Как это происходит:
Запрос отправляется на сервер.
Сервер не закрывает соединение, пока у него не возникнет сообщение для отсылки.
Когда появляется сообщение – сервер отвечает на запрос, посылая его.
Браузер немедленно делает новый запрос.
Сравнение
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, позволяющий "мягко" переключаться между протоколами
Комментарии
Комментариев пока нет.