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("Отримано", data.updates.length, "updates");
}
} catch (error) {
console.error("Помилка опитування:", 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.