Что такое short polling и long polling
Что проверяют
Понимаете ли вы, чем браузер и сервер платят за каждый способ узнать об изменениях, и умеете ли выбирать осознанно. Вопрос почти всегда ведёт дальше, к SSE и WebSocket, поэтому ответ «длинный опрос лучше» без условий считают слабым.
Как отвечать
Короткий опрос: клиент раз в интервал спрашивает сервер, тот отвечает сразу, даже если ничего не изменилось. Средняя задержка это половина интервала, нагрузка постоянная и не зависит от того, происходит ли что-нибудь.
Длинный опрос: клиент шлёт запрос, сервер молчит, пока не появится событие или не выйдет таймаут. Получив ответ, клиент сразу открывает следующий запрос. Задержка близка к нулю, пустых ответов почти нет.
Что проговорить обязательно.
Курсор: между ответом и новым запросом есть окно, в которое события успевают произойти, поэтому клиент передаёт позицию, а сервер отдаёт всё, что появилось после неё. Иначе сообщения теряются на переподключении.
Таймауты: посредники рвут висящие соединения, поэтому серверный таймаут ставят заведомо меньше, чем у балансировщика, а пустой ответ считают нормой, а не ошибкой.
Соединения: по HTTP/1.1 браузер держит ограниченное число соединений на источник, и висящий запрос занимает одно из них; HTTP/2 снимает это мультиплексированием. На сервере такое соединение дёшево только на асинхронном стеке, на модели «поток на запрос» оно съедает поток.
Когда что: короткий опрос для редких некритичных обновлений, длинный для чатов и статусов, если WebSocket и SSE недоступны. Для одностороннего потока событий SSE проще обоих: переподключение и идентификаторы событий уже в протоколе.
Где спотыкаются
Не делают отступ с разбросом при ошибках. После перезапуска сервера клиенты возвращаются разом и добивают его; интервал надо увеличивать и разводить случайной добавкой.
Реализуют опрос через setInterval. Если ответ медленнее интервала, запросы наезжают друг на друга и порядок теряется; следующий планируют после завершения предыдущего, а на скрытой вкладке опрос останавливают.
Называют длинный опрос почти веб-сокетом. Он односторонний, каждый цикл это полноценный HTTP-запрос со всеми заголовками и куками, а порядок доставки держится только на курсоре.