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 ms). При всяко активиране на таймера, клиентът създава HTTP GET заявка към сървърния endpoint, обикновено с параметър за времеви печат на последната актуализация. Сървърът получава заявката, проверява за наличие на нови данни след посочения времеви печат и връща отговор — или с нови данни, или с индикатор за липса на актуализации.
Критичният параметър за конфигуриране на Short Polling — интервалът на запитване. Твърде кратък интервал (по-малко от 3 секунди) създава високо натоварване на сървъра и мрежата. Твърде дълъг интервал (над 30 секунди) намалява актуалността на данните. Оптималният интервал зависи от сценария: за мониторинг панели — 5–15 секунди, за новинарски канали — 30–60 секунди, за критични аларми — 1–3 секунди. Изборът на интервал винаги е компромис между актуалността на данните и натоварването на инфраструктурата.
За намаляване на натоварването при бездействие се използва адаптивен интервал: ако няколко последователни заявки върнат празен резултат, интервалът се увеличава (напр. от 5 на 15 секунди). При поява на нови данни, интервалът се нулира до минималната стойност. Алгоритъмът на експоненциално забавяне (exponential backoff) позволява намаляване на броя на празните заявки 3–5 пъти при редки актуализации.
Нека разгледаме клиентската реализация на Short Polling с използване на setInterval и Fetch API. Функцията приема URL на endpoint-а и интервал на запитване в милисекунди.
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("Polling неуспешен:", 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 заявки в минута | По събития, обикновено много по-малко |
| Натоварване на сървъра | Високо при малък интервал | Задържане на връзки, асинхронна обработка |
| Трафик при бездействие | Максимален, всяка заявка със заглавки | Минимален, една отворена връзка |
| Мащабиране | Просто, заявки без състояние | Сложно, изисква споделена опашка от събития |
Изборът между техники зависи от честотата на актуализации на данните. Ако събитията се случват по-често от веднъж на 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 или прокси сървър за намаляване на натоварването на backend.
Заключение
setInterval или рекурсивен setTimeout с постоянен или адаптивен интервал.Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също