Short Polling — это техника взаимодействия клиента и сервера, при которой клиент отправляет HTTP-запросы через фиксированные интервалы времени для получения обновлённых данных. Сервер обрабатывает каждый запрос немедленно, возвращая актуальное состояние даже при отсутствии изменений. По данным Amazon Web Services, 2024, Short Polling является наиболее простым для реализации, но наименее эффективным методом опроса, создающим избыточную нагрузку на сервер и сеть.
Главное
Short Polling — это паттерн коммуникации, при котором клиент периодически отправляет HTTP-запросы к серверу с заранее заданным интервалом, а сервер обрабатывает каждый запрос синхронно и немедленно возвращает результат. Интервал опроса задаётся на стороне клиента с помощью таймеров и обычно составляет от 1 до 60 секунд в зависимости от требований к актуальности данных.
Short Polling — хронологически первый механизм организации реального времени в веб-приложениях. В начале 2000-х годов, до появления XMLHttpRequest второго поколения, веб-страницы использовали <meta http-equiv="refresh"> или периодическую перезагрузку iframe для обновления содержимого. С появлением технологии AJAX (Asynchronous JavaScript and XML) в 2005 году Short Polling стал стандартным подходом для обновления данных без полной перезагрузки страницы.
Архитектура Short Polling включает три компонента: клиентский таймер, HTTP-запрос и серверный обработчик. Клиент запускает интервальный таймер, по срабатыванию которого отправляется GET-запрос к серверу. Сервер выполняет запрос к базе данных или другому источнику, формирует ответ и немедленно возвращает его клиенту. Клиент обновляет интерфейс и ждёт следующего срабатывания таймера. Этот цикл повторяется бесконечно, пока приложение активно.
Главная проблема Short Polling — неизбежные пустые запросы. Если данные изменяются редко, большинство запросов возвращают результат "без изменений", тратя пропускную способность сети и процессорное время на обработку. При 10 000 клиентов с интервалом опроса 5 секунд сервер получает 2 000 запросов в секунду — значительная часть которых бесполезна, если частота обновлений составляет 1 событие в минуту.
Short Polling работает по простому циклу: клиент устанавливает интервальный таймер с заданным периодом (например, 5000 мс). При каждом срабатывании таймера клиент формирует HTTP GET-запрос к серверному эндпоинту, обычно с параметром временной метки последнего обновления. Сервер получает запрос, проверяет наличие новых данных после указанной метки и возвращает ответ — либо с новыми данными, либо с индикатором отсутствия обновлений.
Критический параметр настройки Short Polling — интервал опроса. Слишком короткий интервал (менее 3 секунд) создаёт высокую нагрузку на сервер и сеть. Слишком длинный (более 30 секунд) снижает актуальность данных. Оптимальный интервал зависит от сценария: для панелей мониторинга — 5–15 секунд, для лент новостей — 30–60 секунд, для критических алертов — 1–3 секунды. Выбор интервала всегда является компромиссом между актуальностью данных и нагрузкой на инфраструктуру.
Для снижения нагрузки при простое используется адаптивный интервал: если несколько последовательных запросов вернули пустой результат, интервал увеличивается (например, с 5 до 15 секунд). При появлении новых данных интервал сбрасывается до минимального значения. Алгоритм экспоненциальной задержки (exponential backoff) позволяет сократить количество пустых запросов в 3–5 раз при редких обновлениях.
Рассмотрим клиентскую реализацию Short Polling с использованием setInterval и Fetch API. Функция принимает URL эндпоинта и интервал опроса в миллисекундах.
function startPolling(url, intervalMs) {
const lastTimestamp = new Date().toISOString();
const timerId = setInterval(async () => {
try {
const params = new URLSearchParams({
since: lastTimestamp
});
const response = await fetch(url + "?" + params);
const data = await response.json();
if (data.updates && data.updates.length > 0) {
renderUpdates(data.updates);
console.log("Received", data.updates.length, "updates");
}
} catch (error) {
console.error("Polling failed:", error);
}
}, intervalMs);
return timerId;
}
const timer = startPolling("/api/updates", 5000);
// clearInterval(timer) для остановки
Код создаёт интервал опроса с периодом 5 секунд и передаёт серверу временную метку последнего обновления. Сервер может использовать этот параметр для фильтрации данных и возврата только новых записей, сокращая объём передаваемой информации. Функция возвращает идентификатор таймера для возможности остановки опроса.
Серверная реализация для Short Polling предельно проста — это обычный REST-endpoint, принимающий GET-запросы и возвращающий JSON-ответ с текущим состоянием или данными, изменёнными после указанной метки.
const express = require("express");
const app = express();
let items = [];
app.get("/api/updates", (req, res) => {
const since = req.query.since;
const filtered = items.filter(item => item.timestamp > since);
res.json({ updates: filtered });
});
app.listen(3000);
Сервер получает параметр since и фильтрует записи, чья временная метка превышает указанную. Такой подход минимизирует объём данных в каждом ответе, возвращая только инкрементальные изменения. При отсутствии новых данных сервер возвращает пустой массив, а клиент продолжает опрос по расписанию.
Short Polling и Long Polling решают одну задачу — доставку данных от сервера — но кардинально различаются по эффективности. Short Polling использует фиксированный интервал запросов, создавая предсказуемую нагрузку, в то время как Long Polling удерживает соединение до появления события, минимизируя количество пустых ответов.
| Критерий | Short Polling | Long Polling |
|---|---|---|
| Сложность реализации | Низкая, стандартный REST | Средняя, асинхронная обработка |
| Задержка обновлений | Фиксированная, до N секунд | Минимальная, при возникновении события |
| Количество запросов | Постоянное, N запросов в минуту | По событиям, обычно значительно меньше |
| Нагрузка на сервер | Высокая при малом интервале | Удержание соединений, асинхронная обработка |
| Трафик при простое | Максимальный, каждый запрос с заголовками | Минимальный, одно открытое соединение |
| Масштабирование | Простое, stateless запросы | Сложное, требуется общая очередь событий |
Выбор между техниками зависит от частоты обновлений данных. Если события происходят чаще, чем раз в 10 секунд — оба подхода дают сопоставимую нагрузку, и Short Polling может оказаться проще. Если события редкие (часы или минуты между изменениями) — Long Polling предпочтительнее, так как не создаёт пустых запросов. Для промежуточных сценариев выбор зависит от инфраструктурных ограничений и возможности использовать WebSocket.
Short Polling применяется в сценариях, где требования к актуальности данных невысоки, а простота реализации имеет приоритет над эффективностью. Наиболее типичные случаи — внутренние административные панели, системы мониторинга с невысокой частотой алертов и приложения, где задержка в 15–30 секунд является приемлемой.
Важное ограничение — Short Polling не подходит для критичных по времени приложений (торговые терминалы, системы экстренного оповещения), где задержка даже в 1 секунду неприемлема. В таких сценариях необходимо использовать WebSocket, Server-Sent Events или Long Polling. При проектировании системы с Short Polling следует рассчитывать бюджет запросов: при 1 000 клиентов с интервалом 5 секунд сервер обрабатывает 12 000 запросов в минуту, что требует соответствующей ресурсной базы.
Часто задаваемые вопросы
Short Polling — это когда приложение каждые N секунд спрашивает сервер: "есть новые данные?", и сервер каждый раз отвечает, даже если ничего не изменилось. Это как подходить к почтовому ящику каждые 5 минут, чтобы проверить, пришла ли новая почта.
Оптимальный интервал Short Polling зависит от сценария: 5–10 секунд для панелей мониторинга, 15–30 секунд для лент новостей, 30–60 секунд для статус-страниц. Интервал должен быть компромиссом между актуальностью данных и нагрузкой на сервер. Начните с 10 секунд и корректируйте по результатам тестирования.
Short Polling — клиент постоянно "дёргает" сервер с фиксированным интервалом. Long Polling — клиент делает один запрос, а сервер держит его открытым до появления данных. Short Polling проще реализовать, но он создаёт больше пустых запросов при редких обновлениях.
Short Polling проще в реализации, чем WebSocket, и не требует специального протокола — работает через обычные HTTP-запросы. Short Polling оправдан для простых внутренних систем, где задержка 10–30 секунд приемлема, а инфраструктурные затраты на поддержку WebSocket неоправданны.
Используйте адаптивный интервал: при отсутствии обновлений увеличивайте паузу между запросами в 2–3 раза. Добавьте параметр since с меткой последнего запроса, чтобы сервер возвращал только инкрементальные изменения. Кэшируйте ответы на стороне CDN или прокси-сервера для снижения нагрузки на бэкенд.
Итоги
setInterval или рекурсивный setTimeout с постоянным или адаптивным интервалом.Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.