Long Polling este o tehnică de interacțiune client-server în care serverul menține cererea HTTP deschisă până la apariția datelor noi sau expirarea timeout-ului. Spre deosebire de interogarea periodică, serverul nu returnează imediat un răspuns gol, ci așteaptă producerea unui eveniment pentru a trimite datele către client. Potrivit MDN Web Docs, 2024, Long Polling rămâne o soluție căutată pentru aplicațiile în timp real unde WebSocket nu este disponibil sau este redundant.
Principalele puncte
Long Polling este un model de interacțiune în arhitectura client-server în care clientul inițiază o cerere HTTP, iar serverul amână trimiterea răspunsului până când apar date noi sau expiră un timeout specificat. După primirea răspunsului, clientul trimite imediat următoarea cerere, creând efectul unei conexiuni continue.
Tehnica Long Polling a apărut ca o dezvoltare evolutivă a Short Polling pentru reducerea numărului de cereri HTTP goale. În interogarea tradițională, clientul trimite cereri la fiecare N secunde, iar serverul răspunde chiar și în absența datelor noi. În Long Polling, serverul utilizează un mecanism de menținere a conexiunii, ceea ce reduce radical volumul de trafic inutil.
Înainte de apariția WebSocket în 2011, Long Polling era principala metodă de organizare a timpului real în web. Companii precum Facebook și Gmail au folosit această tehnică pentru chat-urile și notificările lor la începutul anilor 2010. Potrivit cercetării High Performance Browser Networking (Grigorik, 2013), Long Polling procesa până la 95% din toate conexiunile în timp real în aplicațiile web mari ale acelei perioade.
Clientul trimite o cerere HTTP standard către server. Serverul, după primirea cererii, nu returnează imediat răspunsul — plasează cererea într-o coadă de așteptare. Când pe server are loc un eveniment (mesaj nou, modificare de date), serverul formează răspunsul și îl trimite clientului. Clientul, după primirea răspunsului, creează imediat o nouă cerere Long Polling, iar ciclul se repetă.
Long Polling funcționează conform următoarei secvențe de pași. Clientul trimite o cerere HTTP GET către endpoint-ul serverului. Serverul, după primirea cererii, verifică disponibilitatea datelor noi în coada de evenimente. Dacă nu există date, serverul menține cererea în stare de așteptare, fără a trimite imediat răspunsul. Mecanismul de menținere depinde de implementarea serverului — cel mai des se utilizează procesarea asincronă cu callback-uri sau arhitectura bazată pe evenimente.
Când pe partea serverului are loc un eveniment (de exemplu, utilizatorul a trimis un mesaj în chat), serverul formează un răspuns HTTP cu corpul ce conține aceste date și încheie conexiunea. Clientul primește răspunsul, procesează datele și inițiază imediat o nouă cerere. Dacă în timpul așteptării nu au apărut date, serverul trimite un răspuns gol la expirarea timeout-ului, iar clientul reia conexiunea. Timeout-ul este de obicei de 30–60 de secunde pentru un echilibru între încărcare și întârziere.
Parametrul cheie al configurării Long Polling este timeout-ul de așteptare. Un timeout prea scurt (sub 10 secunde) duce la creșterea numărului de cereri, apropiind tehnica de Short Polling. Un timeout prea lung (peste 120 de secunde) poate cauza întreruperea conexiunii de către proxy-urile intermediare și balansoarele de sarcină. Valoarea recomandată pentru majoritatea scenariilor este de 30–45 de secunde.
Dacă pe server au avut loc mai multe evenimente în timpul unei singure cereri Long Polling, serverul trebuie să le transmită pe toate într-un singur răspuns sau să organizeze o coadă de evenimente pe partea clientului. În acest scop se utilizează bufferizarea evenimentelor: serverul acumulează evenimentele care au avut loc în timpul menținerii cererii și le transmite ca un tablou de date în corpul răspunsului.
Să analizăm o implementare simplă a Long Polling pe partea clientului folosind Fetch API modern. Funcția client trimite o cerere și se autoapelează recursiv după primirea răspunsului.
async function longPoll(url) {
try {
const response = await fetch(url);
const data = await response.json();
handleData(data);
longPoll(url);
} catch (error) {
console.error("Eroare Long Polling", error);
setTimeout(() => longPoll(url), 3000);
}
}
function handleData(data) {
if (data.events && data.events.length > 0) {
data.events.forEach(event => {
console.log("Eveniment nou:", event);
});
}
}
longPoll("/api/events");
Acest cod creează o buclă infinită Long Polling: după primirea răspunsului, funcția trimite imediat o nouă cerere. În caz de eroare de conexiune, se stabilește o întârziere de trei secunde înainte de reîncercare, pentru a evita o încărcare în avalanșă a serverului.
Pe partea serverului, este necesar să se mențină cererea până la apariția evenimentului sau expirarea timeout-ului. Un exemplu de implementare folosind EventEmitter în Node.js demonstrează acest mecanism.
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);
Partea server utilizează EventEmitter pentru a notifica conexiunile Long Polling în așteptare la apariția datelor noi. La atingerea timeout-ului de 30 de secunde, serverul returnează un tablou gol de evenimente, iar clientul creează o nouă cerere.
Long Polling se aplică în scenarii care necesită livrarea datelor în timp real, dar unde utilizarea WebSocket este imposibilă din motive tehnice sau de infrastructură. Cele mai frecvente cazuri — proxy-uri corporative și firewall-uri care blochează conexiunile WebSocket, precum și medii cu suport limitat al protocolului pe partea serverului.
Factorul cheie al alegerii Long Polling este compatibilitatea inversă. Toți clienții și serverele HTTP suportă această metodă, ceea ce o face o soluție universală pentru timp real fără dependențe suplimentare. Potrivit HTTP Archive (2024), aproximativ 8% din toate site-urile web continuă să utilizeze Long Polling pentru funcționalitatea de bază în timp real.
Long Polling și Short Polling rezolvă aceeași sarcină — livrarea datelor de la server la client — dar diferă fundamental prin mecanism și eficiență. Short Polling utilizează un interval fix de interogare, în care clientul trimite cereri HTTP la intervale egale, indiferent dacă pe server au apărut date noi.
| Caracteristică | Long Polling | Short Polling |
|---|---|---|
| Inițierea răspunsului | Serverul trimite date la eveniment | Serverul răspunde la fiecare cerere a clientului |
| Întârzierea livrării | Minimă, până la 1 secundă | Depinde de intervalul de interogare, 3–60 secunde |
| Numărul de cereri | 1 cerere per eveniment sau timeout | N cereri per unitate de timp (fix) |
| Traficul în repaus | Scăzut (o cerere deschisă) | Ridicat (cereri la fiecare N secunde) |
| Încărcarea serverului | Menținerea conexiunilor | Procesarea cererilor frecvente |
| Complexitatea implementării | Medie (procesare asincronă) | Scăzută (cereri HTTP obișnuite) |
Short Polling este mai simplu de implementat, dar generează o încărcare semnificativ mai mare asupra serverului și rețelei la aceeași frecvență de actualizare a datelor. Dacă se necesită o întârziere mai mică de 5 secunde, Short Polling generează zeci de cereri pe minut, în timp ce Long Polling utilizează o cerere per eveniment sau timeout. Pentru aplicații cu evenimente rare, Long Polling este cu un ordin de mărime mai eficient din punct de vedere al traficului.
WebSocket este un protocol bidirecțional complet în timp real, care funcționează pe TCP după o strângere de mână HTTP inițială. Spre deosebire de Long Polling, WebSocket stabilește o singură conexiune permanentă și permite serverului să trimită date clientului în orice moment fără a crea o nouă cerere HTTP.
Alegerea între Long Polling și WebSocket depinde de mai mulți factori. Compatibilitatea: Long Polling funcționează prin orice proxy și firewall, WebSocket poate fi blocat de rețelele corporative. Performanța: WebSocket are un overhead mai mic (2 octeți per cadru față de antetele HTTP complete), ceea ce este critic la frecvența ridicată a mesajelor. Scalabilitatea: Long Polling necesită mai multe resurse pe partea serverului din cauza menținerii multiplelor conexiuni, WebSocket utilizează o conexiune fixă per sesiune.
Potrivit Mozilla Developer Network (2024), WebSocket este suportat de toate browserele moderne începând cu versiunile 2011–2015, dar proxy-urile corporative (de exemplu, Symantec Blue Coat) continuă să îl blocheze în 15–20% din rețelele corporative, ceea ce menține relevanța Long Polling ca soluție fallback.
Întrebări frecvente
Long Polling este atunci când clientul îi cere serverului: „răspunde când apar date noi”, iar serverul menține conexiunea deschisă, așteptând un eveniment. De îndată ce datele apar, serverul răspunde, iar clientul pune imediat aceeași întrebare din nou.
La Short Polling, clientul întreabă serverul la fiecare N secunde dacă există date, chiar dacă nu sunt. La Long Polling, clientul întreabă o dată, iar serverul răspunde doar când datele apar cu adevărat. Long Polling creează mai puține cereri goale și reduce încărcarea rețelei.
Long Polling trebuie folosit când WebSocket nu este disponibil: în rețele corporative cu blocarea protocoalelor non-HTTP, la necesitatea compatibilității inverse cu browserele vechi sau cu limitări din partea hostingului. WebSocket este mai eficient pentru schimbul de date de înaltă frecvență.
Timeout-ul Long Polling recomandat este de 30–45 de secunde. O valoare mai mică (10–15 secunde) crește numărul de cereri, una mai mare (60+ secunde) este riscantă din cauza întreruperii conexiunii de către balansoarele intermediare. Valoarea timeout-ului depinde de arhitectura rețelei și de cerințele de întârziere.
Principalele dezavantaje ale Long Polling — consumul ridicat de memorie pe server la menținerea a mii de conexiuni, dificultatea scalării orizontale (necesită o coadă de evenimente centralizată) și lipsa unei comunicări bidirecționale reale — pentru trimiterea datelor către server sunt necesare cereri POST separate.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și