Long Polling — bu, müştəri və server arasında qarşılıqlı əlaqə texnikasıdır ki, burada server yeni məlumatlar görünənə və ya vaxt aşımı bitənədək HTTP sorğusunu açıq saxlayır. Dövri sorğulamadan fərqli olaraq, server dərhal boş cavab qaytarmır, məlumatları müştəriyə göndərmək üçün hadisənin baş verməsini gözləyir. MDN Web Docs, 2024-ə görə, Long Polling WebSocket-in əlçatan olmadığı və ya həddindən artıq olduğu real vaxt tətbiqləri üçün tələb olunan həll olaraq qalır.
Əsas məqamlar
Long Polling — bu, müştəri-server arxitekturasında qarşılıqlı əlaqə nümunəsidir ki, burada müştəri HTTP sorğusu başladır, server isə yeni məlumatlar görünənə və ya müəyyən vaxt aşımı bitənə qədər cavabın göndərilməsini təxirə salır. Cavabı aldıqdan sonra müştəri dərhal növbəti sorğunu göndərir və davamlı bağlantı effekti yaradır.
Long Polling texnikası boş HTTP sorğularının sayını azaltmaq üçün Short Polling-in təkamül inkişafı kimi yaranmışdır. Ənənəvi sorğulamada müştəri hər N saniyədən bir sorğu göndərir və server yeni məlumat olmasa belə cavab verir. Long Polling-də server bağlantının saxlanması mexanizmindən istifadə edir ki, bu da faydasız trafikin həcmini kəskin şəkildə azaldır.
2011-ci ildə WebSocket-in meydana çıxmasından əvvəl Long Polling vebdə real vaxt təşkilinin əsas üsulu idi. Facebook və Gmail kimi şirkətlər 2010-cu illərin əvvəllərində söhbət və bildirişləri üçün bu texnikadan istifadə edirdilər. High Performance Browser Networking (Grigorik, 2013) tədqiqatına görə, Long Polling o dövrün böyük veb tətbiqlərində real vaxt bağlantılarının 95%-ə qədərini emal edirdi.
Müştəri serverə standart HTTP sorğusu göndərir. Server sorğunu aldıqdan sonra dərhal cavab qaytarmır — sorğunu gözləmə növbəsinə yerləşdirir. Serverdə hadisə baş verdikdə (yeni mesaj, məlumat dəyişikliyi), server cavab yaradır və onu müştəriyə göndərir. Müştəri cavabı aldıqdan sonra dərhal yeni Long Polling sorğusu yaradır və dövr təkrarlanır.
Long Polling aşağıdakı addımlar ardıcıllığı ilə işləyir. Müştəri server endpointinə HTTP GET sorğusu göndərir. Server sorğunu aldıqdan sonra hadisə növbəsində yeni məlumatların olub-olmadığını yoxlayır. Məlumat yoxdursa, server dərhal cavab göndərmədən sorğunu gözləmə vəziyyətində saxlayır. Saxlama mexanizmi serverin tətbiqindən asılıdır — ən çox callback-lərlə asinxron emal və ya hadisə arxitekturası istifadə olunur.
Server tərəfində hadisə baş verdikdə (məsələn, istifadəçi söhbətdə mesaj göndərdi), server bu məlumatları ehtiva edən HTTP cavabı yaradır və bağlantını bitirir. Müştəri cavabı alır, məlumatları emal edir və dərhal yeni sorğu başladır. Gözləmə müddətində məlumat görünməzsə, server vaxt aşımı bitdikdə boş cavab göndərir və müştəri də bağlantını yenidən yaradır. Timeout adətən yük və gecikmə arasında tarazlıq üçün 30–60 saniyə təşkil edir.
Long Polling konfiqurasiyasının əsas parametri gözləmə vaxt aşımıdır. Çox qısa vaxt aşımı (10 saniyədən az) sorğuların sayının artmasına gətirib çıxarır, texnikanı Short Polling-ə yaxınlaşdırır. Çox uzun (120 saniyədən çox) aralıq proksi və yük balanslaşdırıcıları tərəfindən bağlantının qırılmasına səbəb ola bilər. Əksər ssenarilər üçün tövsiyə olunan dəyər 30–45 saniyədir.
Serverdə bir Long Polling sorğusu zamanı bir neçə hadisə baş verərsə, server onların hamısını bir cavabda ötürməli və ya müştəri tərəfində hadisə növbəsi təşkil etməlidir. Bunun üçün hadisə buferləşdirilməsi istifadə olunur: server sorğunun saxlanması zamanı baş vermiş hadisələri toplayır və onları cavabın məzmununda məlumat massivi kimi ötürür.
Müasir Fetch API istifadə edərək müştəri tərəfində Long Polling-in sadə tətbiqini nəzərdən keçirək. Müştəri funksiyası sorğu göndərir və cavabı aldıqdan sonra özünü rekursiv çağırır.
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 xətası", error);
setTimeout(() => longPoll(url), 3000);
}
}
function handleData(data) {
if (data.events && data.events.length > 0) {
data.events.forEach(event => {
console.log("Yeni hadisə:", event);
});
}
}
longPoll("/api/events");
Bu kod sonsuz Long Polling dövrü yaradır: cavabı aldıqdan sonra funksiya dərhal yeni sorğu göndərir. Bağlantı xətası halında serverə qar uçqunu yükünün qarşısını almaq üçün təkrar cəhddən əvvəl üç saniyəlik gecikmə təyin edilir.
Server tərəfində hadisə görünənə və ya vaxt aşımı bitənə qədər sorğunu saxlamaq lazımdır. Node.js-də EventEmitter istifadə edərək tətbiq nümunəsi bu mexanizmi nümayiş etdirir.
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);
Server hissəsi yeni məlumatlar görünəndə gözləyən Long Polling bağlantılarına xəbərdarlıq etmək üçün EventEmitter-dən istifadə edir. 30 saniyəlik vaxt aşımına çatdıqda server boş hadisə massivi qaytarır və müştəri yeni sorğu yaradır.
Long Polling real vaxtda məlumat çatdırılması tələb olunan, lakin texniki və ya infrastruktur səbəblərdən WebSocket istifadəsinin mümkün olmadığı ssenarilərdə tətbiq olunur. Ən geniş yayılmış hallar — WebSocket bağlantılarını bloklayan korporativ proksi və fayrvallar, həmçinin server tərəfində protokolun məhdud dəstəyi olan mühitlərdir.
Long Polling seçiminin əsas amili geriyə uyğunluqdur. Bütün HTTP müştəriləri və serverləri bu metodu dəstəkləyir, bu da onu əlavə asılılıqlar olmadan real vaxt üçün universal həll edir. HTTP Archive (2024) məlumatına görə, bütün veb-saytların təxminən 8%-i əsas real vaxt funksionallığı üçün Long Polling-dən istifadə etməyə davam edir.
Long Polling və Short Polling eyni vəzifəni — məlumatların serverdən müştəriyə çatdırılmasını həll edir, lakin mexanizm və səmərəlilik baxımından əsaslı şəkildə fərqlənir. Short Polling sabit sorğulama intervalından istifadə edir, burada müştəri serverdə yeni məlumatların görünüb-görünməməsindən asılı olmayaraq bərabər vaxt intervallarında HTTP sorğuları göndərir.
| Xüsusiyyət | Long Polling | Short Polling |
|---|---|---|
| Cavabın başlanması | Server hadisə zamanı məlumat göndərir | Server hər müştəri sorğusuna cavab verir |
| Çatdırılma gecikməsi | Minimal, 1 saniyəyə qədər | Sorğulama intervalından asılı, 3–60 saniyə |
| Sorğuların sayı | Hadisə və ya vaxt aşımı üçün 1 sorğu | Vaxt vahidində N sorğu (sabit) |
| Boş vəziyyətdə trafik | Aşağı (bir açıq sorğu) | Yüksək (hər N saniyədən bir sorğular) |
| Server yükü | Bağlantıların saxlanması | Tez-tez sorğuların emalı |
| Tətbiq mürəkkəbliyi | Orta (asinxron emal) | Aşağı (adi HTTP sorğuları) |
Short Polling tətbiqdə daha sadədir, lakin eyni məlumat yeniləmə tezliyində server və şəbəkəyə əhəmiyyətli dərəcədə daha çox yük yaradır. 5 saniyədən az gecikmə tələb olunarsa, Short Polling dəqiqədə onlarla sorğu yaradır, halbuki Long Polling hər hadisə və ya vaxt aşımı üçün bir sorğu istifadə edir. Nadir hadisələri olan tətbiqlər üçün Long Polling trafik baxımından daha səmərəlidir.
WebSocket — bu, ilkin HTTP əl sıxmasından sonra TCP üzərində işləyən tam hüquqlu ikitərəfli real vaxt protokoludur. Long Polling-dən fərqli olaraq, WebSocket bir daimi bağlantı qurur və serverə yeni HTTP sorğusu yaratmadan istənilən vaxt müştəriyə məlumat göndərməyə imkan verir.
Long Polling və WebSocket arasında seçim bir neçə amildən asılıdır. Uyğunluq: Long Polling bütün proksi və fayrvallar vasitəsilə işləyir, WebSocket korporativ şəbəkələr tərəfindən bloklana bilər. Performans: WebSocket daha kiçik overhead-ə malikdir (tam HTTP başlıqlarına qarşı çərçivə başına 2 bayt), bu mesajların yüksək tezliyində kritikdir. Ölçeklenebilirlik: Long Polling çoxsaylı bağlantıların saxlanması səbəbindən server tərəfində daha çox resurs tələb edir, WebSocket hər sessiya üçün sabit bağlantı istifadə edir.
Mozilla Developer Network (2024) məlumatına görə, WebSocket 2011–2015-ci il versiyalarından etibarən bütün müasir brauzerlər tərəfindən dəstəklənir, lakin korporativ proksi (məsələn, Symantec Blue Coat) onu korporativ şəbəkələrin 15–20%-də bloklamağa davam edir ki, bu da Long Polling-in fallback həlli kimi aktuallığını qoruyur.
Tez-tez verilən suallar
Long Polling — bu, müştərinin serverdən “yeni məlumatlar görünəndə cavab ver” soruşduğu və serverin hadisəni gözləyərək bağlantını açıq saxladığı zamandır. Məlumatlar görünən kimi server cavab verir və müştəri dərhal eyni sualı yenidən verir.
Short Polling-də müştəri hər N saniyədən bir serverdən məlumat olub-olmadığını soruşur, hətta məlumat olmasa belə. Long Polling-də müştəri bir dəfə soruşur və server yalnız məlumat həqiqətən görünəndə cavab verir. Long Polling daha az boş sorğu yaradır və şəbəkə yükünü azaldır.
Long Polling WebSocket əlçatan olmadıqda istifadə edilməlidir: qeyri-HTTP protokollarını bloklayan korporativ şəbəkələrdə, köhnə brauzerlərlə geriyə uyğunluq zərurəti olduqda və ya hostinq tərəfində məhdudiyyətlər olduqda. WebSocket yüksək tezlikli məlumat mübadiləsi üçün daha səmərəlidir.
Tövsiyə olunan Long Polling vaxt aşımı 30–45 saniyədir. Daha kiçik dəyər (10–15 saniyə) sorğuların sayını artırır, daha böyük (60+ saniyə) aralıq yük balanslaşdırıcıları tərəfindən bağlantının qırılması risklidir. Vaxt aşımının dəyəri şəbəkə arxitekturasından və gecikmə tələblərindən asılıdır.
Əsas Long Polling çatışmazlıqları — minlərlə bağlantı saxlanarkən serverdə yüksək yaddaş istehlakı, üfüqi miqyaslama çətinliyi (mərkəzləşdirilmiş hadisə növbəsi tələb olunur) və həqiqi ikitərəfli əlaqənin olmaması — serverə məlumat göndərmək üçün ayrıca POST sorğuları lazımdır.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun