HTTP Long Polling (или Server-Sent Events) — технология и способ взаимодействия между клиентом и сервером. Long Polling предполагает установление постоянного соединения между клиентом и сервером.
Клиент-серверная модель в стандартном виде подразумевает, что инициатором любого обмена данными является клиент. Сервер всегда находится в сети и работает, отдавая контент только тогда когда к нему обращается клиент.
Такая организация не очень хорошо подходит для ряда приложений. Например, мэссенджеров и социальных сетей. В любой социальной сети есть лента новостей или уведомления, сообщения в них должны появляться не тогда когда приходит запрос от клиента, а тогда когда на сервер поступают новые данные.
Реализовать это позволяет HTTP Long Poling.
Модель HTTP Long Polling
HTTP Long Poling в общем работает следующим образом:
1. Клиент обращается к серверу с запросом
2. Сервер предоставляет ответ, оставляя при этом соединение открытым
3. Как только на сервер поступает новая информация, адресованная клиенту, информация направляется к нему используя открытое соединение. Пакеты, отправляемые таким образом называются push notifications
Как только клиент получает информацию, он вновь отправляет запрос и устанавливая соединение с сервером, далее процесс повторяется.
Фактически, создается подобие модели при которой запросы генерируются сервером. Клиент всегда готов принимать HTTP запросы, которые отправляет сервер.
При использовании Server-Sent Events (HTTP Long Poling) в приложении всегда возникает ряд моментов и потенциальных сложностей, основные из них
- Использование WiFI и сетей мобильных операторов с постоянным переключением между ними — при этом меняется IP адрес и разрывается соединение
- Сообщения могут теряться если клиент недоступен, система должна быть организована так, чтобы все сообщения доходили, при этом в нужном порядке
- Балансировка нагрузки между серверами, обеспечивающими Long Poling
Все задачи можно реализовать самостоятельно или воспользоваться готовыми решениями, некоторые провайдеры предлагают потоковые стриминговые сети, способные обрабатывать большие объемы данных в режиме реального времени.
Приложения, требующие использования технологий передачи данных, инициализируемых сервером обычно используют AJAX запросы Javascript или написаны на Ruby/Python.