Polling и Long polling

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

Но настроить socket-соединение не всегда очень просто. Иногда это не позволяет хостинг, а иногда просто нет ресурсов на поддержку инфраструктуры, тестирование отказоустойчивости и безопасности. В таком случае можно воспользоваться поллингом.

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

Избирательный участок, где происходит настоящий polling:)

Голосовать мы, конечно же, не будем. А вот опрашивать сервер будем еще как. Идея достаточно простая — регулярно опрашивать сервер на предмет новых изменений.

Обычный polling

Например мы пишем мессенджер и хотим доставлять пользователям новые сообщения. В случае обычного polling клиентское приложение (телефон/браузер) будет кидать запрос GET /messagesкаждые N секунд (например каждые 2 секунды).

Диаграмма общения между клиентом и сервером в случае polling

Решение “в лоб” и приводит к необходимому результату – пользователь получает свои сообщения не познее 2х секунд после их появления. Но минусы достаточно очевидны:

  1. Надо все же ждать 2 секунды до получения некоторых сообщений
  2. Нагрузка на сервер неоправданно высока. Необходимо каждые 2 секунды создавать соединение с сервером, инициализировать приложение и тд. Все этоприводит к накладным расходам

Тут как раз на сцену выходит long polling

Что такое long polling?

Это все тот же polling, но уже с немного другой идеей. В рамках long polling клиент отправляет запрос на сервер с заранее заданным timeout (обычно 30 сек). Сервер обрабатывает этот запрос в режиме бесконечного цикла с указанным timeout и, в рамках цикла, ожидает необходимые для пользователя обновления. Как только обновление появляется сервер сразу же отдает ответ и закрывает соединение.

Общение клиента с серверов в long polling

Таким образом мы лишаемся двух минусов polling и отдаем пользователю обновления с минимальной задержкой. У long polling, конечно же есть свои минусы и для решения их уже есть websockets.