Long Polling је техника интеракције клијента и сервера при којој сервер држи ХТТП захтев отвореним до појаве нових података или истека тајм-аута. За разлику од периодичног испитивања, сервер не враћа празан одговор одмах, већ чека наступање догађаја да пошаље податке клијенту. Према MDN Web Docs, 2024, Long Polling остаје тражено решење за апликације у реалном времену где WebSocket није доступан или је сувишан.
Главно
Long Polling је образац интеракције у архитектури клијент-сервер при којем клијент покреће ХТТП захтев, а сервер одлаже слање одговора до тренутка када се појаве нови подаци или истекне задати тајм-аут. Након пријема одговора, клијент одмах шаље следећи захтев, стварајући ефекат непрекидне везе.
Техника Long Polling се појавила као еволутивни развој Short Polling-а за смањење броја празних ХТТП захтева. У традиционалном испитивању, клијент шаље захтеве сваких N секунди, а сервер одговара чак и при одсуству нових података. У Long Polling-у сервер користи механизам држања везе, што радикално смањује количину бескорисног саобраћаја.
Пре појаве WebSocket-а 2011. године, Long Polling је био главни начин организовања реалног времена на вебу. Компаније попут Facebook-а и Gmail-а користиле су ову технику за своје четове и обавештења почетком 2010-их. Према истраживању High Performance Browser Networking (Grigorik, 2013), Long Polling је обрађивао до 95% свих веза у реалном времену у великим веб апликацијама тог периода.
Клијент шаље стандардни ХТТП захтев серверу. Сервер, по пријему захтева, не враћа одговор одмах — поставља захтев у ред чекања. Када на серверу наступи догађај (нова порука, промена података), сервер формира одговор и шаље га клијенту. Клијент, по пријему одговора, одмах ствара нови Long Polling захтев и циклус се понавља.
Long Polling ради по следећем низу корака. Клијент шаље ХТТП GET захтев ка серверском ендпоинту. Сервер, по пријему захтева, проверава присуство нових података у реду догађаја. Ако података нема, сервер држи захтев у стању чекања, не шаљући одговор одмах. Механизам држања зависи од имплементације сервера — најчешће се користи асинхрона обрада с повратним позивима или догађајна архитектура.
Када на страни сервера наступи догађај (на пример, корисник је послао поруку у чету), сервер формира ХТТП одговор са телом које садржи те податке и завршава везу. Клијент прима одговор, обрађује податке и одмах покреће нови захтев. Ако се у току чекања подаци нису појавили, сервер шаље празан одговор по истеку тајм-аута, а клијент такође поново успоставља везу. Timeout обично износи 30–60 секунди за равнотежу између оптерећења и кашњења.
Кључни параметар подешавања Long Polling-а је тајм-аут чекања. Прекратак тајм-аут (мање од 10 секунди) доводи до повећања броја захтева, приближавајући технику Short Polling-у. Предугачак (више од 120 секунди) може изазвати прекид везе од стране посредничких проксија и балансера оптерећења. Препоручена вредност за већину сценарија је 30–45 секунди.
Ако се на серверу догодило неколико догађаја током једног Long Polling захтева, сервер их треба пренети све у једном одговору или организовати ред догађаја на страни клијента. У ту сврху се користи баферовање догађаја: сервер акумулира догађаје који су се догодили током држања захтева и преноси их као низ података у телу одговора.
Размотримо једноставну имплементацију Long Polling-а на страни клијента коришћењем савременог Fetch API. Клијентска функција шаље захтев и рекурзивно позива себе након пријема одговора.
async function longPoll(url) {
try {
const response = await fetch(url);
const data = await response.json();
handleData(data);
longPoll(url);
} catch (error) {
console.error("Long Polling грешка", error);
setTimeout(() => longPoll(url), 3000);
}
}
function handleData(data) {
if (data.events && data.events.length > 0) {
data.events.forEach(event => {
console.log("Нови догађај:", event);
});
}
}
longPoll("/api/events");
Овај код ствара бесконачну петљу Long Polling-а: након пријема одговора, функција одмах шаље нови захтев. При грешци везе поставља се тросекундно кашњење пре поновног покушаја како би се избегло лавинско оптерећење сервера.
На страни сервера потребно је држати захтев док се не појави догађај или не истекне тајм-аут. Пример имплементације коришћењем EventEmitter у Node.js-у демонстрира овај механизам.
const express = require("express");
const EventEmitter = require("events");
const app = express();
const eventBus = new EventEmitter();
app.get("/api/events", (req, res) => {
const timeout = setTimeout(() => {
res.json({ events: [] });
}, 30000);
eventBus.once("new-event", (data) => {
clearTimeout(timeout);
res.json({ events: [data] });
});
});
app.post("/api/events", (req, res) => {
eventBus.emit("new-event", req.body);
res.send({ status: "ok" });
});
app.listen(3000);
Серверски део користи EventEmitter за обавештавање Long Polling веза које чекају при појави нових података. По достизању 30-секундног тајм-аута, сервер враћа празан низ догађаја, а клијент ствара нови захтев.
Long Polling се примењује у сценаријима где је потребна достава података у реалном времену, али је употреба WebSocket-а немогућа из техничких или инфраструктурних разлога. Најчешћи случајеви — корпоративни проксији и заштитни зидови који блокирају WebSocket везе, као и окружења с ограниченом подршком протокола на страни сервера.
Кључни фактор избора Long Polling-а је уназад компатибилност. Сви ХТТП клијенти и сервери подржавају ову методу, што је чини универзалним решењем за реално време без додатних зависности. Према HTTP Archive (2024), око 8% свих веб-сајтова наставља да користи Long Polling за основну функционалност реалног времена.
Long Polling и Short Polling решавају исти задатак — доставу података од сервера до клијента — али се суштински разликују по механизму и ефикасности. Short Polling користи фиксни интервал испитивања, при чему клијент шаље ХТТП захтеве у једнаким временским размацима без обзира на то да ли су се на серверу појавили нови подаци.
| Карактеристика | Long Polling | Short Polling |
|---|---|---|
| Иницијација одговора | Сервер шаље податке при догађају | Сервер одговара на сваки захтев клијента |
| Кашњење доставе | Минимално, до 1 секунде | Зависи од интервала испитивања, 3–60 секунди |
| Број захтева | 1 захтев по догађају или тајм-ауту | N захтева у јединици времена (фиксно) |
| Саобраћај при мировању | Низак (један отворени захтев) | Висок (захтеви сваких N секунди) |
| Оптерећење сервера | Држање веза | Обрада честих захтева |
| Сложеност имплементације | Средња (асинхрона обрада) | Ниска (обични ХТТП захтеви) |
Short Polling је једноставнији за имплементацију, али ствара знатно веће оптерећење сервера и мреже при истој учесталости ажурирања података. Ако је потребно кашњење мање од 5 секунди, Short Polling ствара десетине захтева у минути, док Long Polling користи један захтев по догађају или тајм-ауту. За апликације са ретким догађајима, Long Polling је за ред величине ефикаснији по саобраћају.
WebSocket је пуноправан двосмерни протокол реалног времена који ради преко TCP-а након почетног ХТТП руковања. За разлику од Long Polling-а, WebSocket успоставља једну сталну везу и омогућава серверу да шаље податке клијенту у било ком тренутку без стварања новог ХТТП захтева.
Избор између Long Polling-а и WebSocket-а зависи од неколико фактора. Компатибилност: Long Polling ради кроз све проксије и заштитне зидове, WebSocket могу блокирати корпоративне мреже. Перформансе: WebSocket има мањи overhead (2 бајта по оквиру наспрам потпуних ХТТП заглавља), што је критично при великој учесталости порука. Скалабилност: Long Polling захтева више ресурса на страни сервера због држања вишеструких веза, WebSocket користи фиксну везу по сесији.
Према Mozilla Developer Network (2024), WebSocket је подржан у свим савременим прегледачима од верзија 2011–2015, али корпоративни проксији (нпр. Symantec Blue Coat) настављају да га блокирају у 15–20% корпоративних мрежа, што одржава актуелност Long Polling-а као fallback решења.
Често постављана питања
Long Polling је када клијент пита сервер: „одговори када се појаве нови подаци“, а сервер држи везу отвореном, очекујући догађај. Чим се подаци појаве, сервер одговара, а клијент одмах поставља исто питање поново.
Код Short Polling-а клијент пита сервер сваких N секунди да ли има података, чак и ако их нема. Код Long Polling-а клијент пита једном, а сервер одговара само када се подаци заиста појаве. Long Polling ствара мање празних захтева и смањује оптерећење мреже.
Long Polling треба користити када WebSocket није доступан: у корпоративним мрежама са блокирањем не-ХТТП протокола, при потреби уназад компатибилности са старим прегледачима или ограничењима на страни хостинга. WebSocket је ефикаснији за високофреквентну размену података.
Препоручени тајм-аут Long Polling-а је 30–45 секунди. Мања вредност (10–15 секунди) повећава број захтева, већа (60+ секунди) је ризична због прекида везе од стране посредничких балансера. Вредност тајм-аута зависи од архитектуре мреже и захтева за кашњењем.
Главни недостаци Long Polling-а — висока потрошња меморије на серверу при држању хиљада веза, тешкоћа хоризонталног скалирања (потребан централизовани ред догађаја) и одсуство праве двосмерне комуникације — за слање података на сервер потребни су посебни POST захтеви.
Итог
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође