SSE — bu nədir, Server-Sent Events və birtərəfli striminq

Müəllif: IT Sectr Dərc olunub: 2026-06-02 Oxuma vaxtı: 8 dəq

SSE (Server-Sent Events) — W3C standartı olub, serverə tək HTTP bağlantısı vasitəsilə birtərəfli rejimdə klientə axın məlumatları göndərməyə imkan verir. WebSocket-dən fərqli olaraq, SSE adi HTTP üzərində işləyir və klient tərəfində xüsusi protokol və ya kitabxana tələb etmir. W3C HTML Living Standard (2025) spesifikasiyasına əsasən, EventSource API bütün müasir brauzerlərdə, o cümlədən Chrome, Firefox, Safari və Edge-də dəstəklənir.

Əsas məqamlar

  • SSE — HTTP bağlantısı vasitəsilə serverdən klientə birtərəfli məlumat ötürmə standartı.
  • EventSource API — xarici kitabxanalar olmadan SSE qəbul etmək üçün daxili brauzer interfeysi.
  • Avtomatik yenidən qoşulma — qırılma zamanı brauzer avtomatik olaraq bağlantını bərpa edir.
  • Mətn protokolu — məlumatlar text/event-stream formatında sadə mətn formatı ilə ötürülür.
  • Birtərəfli əlaqə — SSE bildirişlər, xəbər lentləri, tickerlər və monitorinq üçün uyğundur, lakin söhbətlər üçün deyil.

SSE nədir?

SSE (Server-Sent Events) — veb-serverə bağlantı qurulduqdan sonra istənilən vaxt klientə məlumat göndərməyə imkan verən texnologiyadır. WHATWG tərəfindən HTML Living Standard-ın bir hissəsi kimi standartlaşdırılıb və text/event-stream MIME tipindən istifadə edir. SSE mesaj identifikatoru, hadisə növü və yenidən qoşulma gecikməsini göstərmək imkanı ilə mətn məlumatlarının ötürülməsini dəstəkləyir.

WebSocket-dən fərqli olaraq, ikiterəfli protokol və upgrade sorğusu tələb edən WebSocket-dən fərqli olaraq, SSE adi HTTP üzərində işləyir. Server Content-Type: text/event-stream başlığını təyin edir, məlumatları hissələrlə göndərir və bağlantını açıq saxlayır. Klient məlumatları avtomatik olaraq axını pars edən və hadisələr yaradan brauzer EventSource API-si vasitəsilə qəbul edir.

CanIUse (2025) məlumatlarına görə, EventSource API qlobal olaraq brauzerlərin 97,5%-də dəstəklənir. Internet Explorer və bəzi mobil brauzerlərdə (Samsung Internet versiya 7.0-dək) dəstəklənmir. Bu hallar üçün XHR streaming vasitəsilə EventSource-u emulyasiya edən polifillər mövcuddur. SSE HTTP/1.1 pipelining ilə işləmir, lakin HTTP/2 server push ilə tam uyğunlaşır.

Tarix və standartlaşdırma

SSE 2009-cu ildə HTML5 spesifikasiyasının bir hissəsi olaraq Server-Sent DOM Events adı ilə təklif edilmişdir. İlk tətbiq Opera 9.0-da, daha sonra Firefox 6.0 (2011), Chrome 9.0 (2011) və Safari 5.0 (2010)-da ortaya çıxdı. 2015-ci ildə spesifikasiya HTML Living Standard-ın ayrıca bölməsinə ayrıldı. Onillik tarixinə baxmayaraq, SSE birtərəfli təbiətinə görə WebSocket-dən daha az populyar olaraq qalır.

SSE necə işləyir

SSE-nin iş mexanizmi belədir: klient server endpoint-inin URL-i ilə EventSource nümunəsi yaradır. Brauzer Accept: text/event-stream başlığı ilə GET sorğusu göndərir. Server 200 OK statusu və Content-Type: text/event-stream başlığı ilə cavab verir, sonra event-stream formatında məlumat göndərməyə başlayır. Server terminate siqnalı göndərənə və ya klient close() çağırana qədər bağlantı açıq qalır.

Server tərəfində məlumat hissələrlə (chunked transfer encoding) göndərilir. Hər bir məlumat bloku sahə sətirlərindən (event, data, id, retry) ibarət mətn mesajıdır. Server istənilən vaxt mesaj göndərə bilər, bu da SSE-ni bildirişlər və status yeniləmələri üçün ideal edir. Bağlantı (WebSocket-də olduğu kimi) daimi heartbeat paket mübadiləsi tələb etmir, baxmayaraq ki, retry sahəsi yenidən qoşulma tezliyini idarə edir.

Performans testlərinə (2024) görə, SSE 256 bayt mesaj ölçüsündə bir bağlantıda saniyədə 10 000 mesaj ötürmə qabiliyyətini təmin edir. Server tərəfində hər SSE bağlantısı təxminən 5–10 KB yaddaş sərf edir ki, bu da bir serverə 1 GB RAM ilə 50 000+ eyni vaxtda bağlantı dəstəkləməyə imkan verir. Bu, ikili protokolun olmaması səbəbindən WebSocket-dən əhəmiyyətli dərəcədə azdır.

Event-stream formatı

Format text/event-stream — hər bir mesajın yeni sətir simvolları ilə ayrılmış adlandırılmış sahələrdən ibarət olduğu sadə mətn protokoludur. Hər bir sahə «SahəAdı: dəyər» formatına malikdir. Mesajlar iki yeni sətir simvolu ( ) ilə ayrılır.

Dəstəklənən sahələr: event (hadisə növü, standart olaraq message), data (məlumat sətri, çoxsətirli ola bilər), id (son hadisə identifikatoru, Last-Event-ID-də saxlanılır), retry (yenidən qoşulma vaxtı millisaniyələrlə). Şərhlər ikinöqtə (:) ilə başlayır və parser tərəfindən nəzərə alınmır, lakin heartbeat üçün istifadə edilə bilər.

SahəMəcburiMəqsəd
eventXeyrHadisə növü (standart olaraq message)
dataBəliMesajın məlumat sətri
idXeyrLast-Event-ID üçün hadisə identifikatoru
retryXeyrYenidən qoşulma gecikməsi ms-lə

Event-stream axını nümunəsi

text
: heartbeat comment
event: update
data: {"user": "Alice", "action": "typing"}
id: 1001

event: notification
data: {"type": "info", "text": "New version available"}
data: {"type": "action", "url": "/upgrade"}
retry: 3000

event: close
data: Session ended

Klient tərəfində EventSource API

EventSource API — SSE qəbul etmək üçün daxili brauzer interfeysi. Bağlantı yaratmaq üçün endpoint URL-i ilə konstruktoru çağırmaq kifayətdir. EventSource avtomatik olaraq bağlantı qurur, yenidən qoşulmanı idarə edir və daxil olan mesajları JavaScript hadisələrinə pars edir.

EventSource hadisələri: open (bağlantı quruldu), message (event göstərilmədən mesaj alındı), error (bağlantı xətası). Xüsusi hadisələr (event: custom) üçün addEventListener hadisə adı ilə istifadə edilə bilər. EventSource yenidən qoşulma zamanı avtomatik olaraq Last-Event-ID başlığını göndərir ki, bu da serverə axını kəsildiyi yerdən bərpa etməyə imkan verir.

MDN sənədləşməsinə (2025) görə, EventSource CORS və etimadnamələrin ötürülməsini (withCredentials) dəstəkləyir. Xüsusi başlıqlar və ya sorğu gövdəsi ötürmək üçün EventSource uyğun deyil — fetch + ReadableStream vasitəsilə əl ilə tətbiq tələb olunur. EventSource ikili məlumatları dəstəkləmir — yalnız mətn və JSON.

JavaScript klient kodu

js
const eventSource = new EventSource('/api/events/stream');

eventSource.addEventListener('open', () => {
    console.log('SSE bağlantısı açıldı');
});

eventSource.addEventListener('message', (event) => {
    const data = JSON.parse(event.data);
    console.log('Alındı:', data);
    renderUpdate(data);
});

eventSource.addEventListener('notification', (event) => {
    const notification = JSON.parse(event.data);
    showNotification(notification.text);
});

eventSource.addEventListener('error', (error) => {
    console.error('SSE xətası:', error);
    // Brauzerin avtomatik yenidən qoşulması
});

// Bağlantını bağla
eventSource.close();

SSE vs WebSocket: müqayisə

SSE və WebSocket — real-vaxt kommunikasiyası üçün müxtəlif texnologiyalar, hər biri öz güclü tərəflərinə malikdir. WebSocket ikitərəfli məlumat mübadiləsi (söhbətlər, oyunlar, birgə redaktə) üçün, SSE isə serverdən klientə birtərəfli axınlar (bildirişlər, xəbər lentləri, tickerlər) üçün uyğundur.

Əsas fərq — WebSocket HTTP/1.1-dən WebSocket protokoluna (ws://) upgrade sorğusu tələb edir, bu da korporativ proxilər tərəfindən bloklana bilər. SSE adi HTTP üzərində işləyir, bütün proxilərdən keçir və serverin xüsusi konfiqurasiyasını tələb etmir. SSE həmçinin tətbiqdə daha sadədir — serverə əlavə kitabxana lazım deyil, sadəcə HTTP cavabını düzgün formalaşdırmaq kifayətdir.

Müqayisəli testlərə (2024) görə, bir server prosesində SSE daha sadə protokola görə WebSocket-dən 30–50% daha çox bağlantı dəstəkləyir. Lakin SSE-nin latency-si daha yüksəkdir (50–200 ms WebSocket-də 10–50 ms qarşı), çünki SSE chunked HTTP-dən istifadə edir, ikili freymlərlə tam ikitərəfli axın deyil.

XarakteristikaSSEWebSocket
İstiqamətServer → klientİkitərəfli
ProtokolHTTP (text/event-stream)ws:// / wss:// (RFC 6455)
Brauzerlər97,5% (daxili EventSource)97% (daxili WebSocket)
MəlumatlarYalnız mətn / JSONMətn + ikili (Blob, ArrayBuffer)
Proksi idarəsiBütün proxilərdən keçirProksi konfiqurasiyası tələb edir
Yenidən qoşulmaAvtomatik (brauzer)Əl ilə tətbiq
TarixçəLast-Event-IDDaxili tarixçə yoxdur

Serverdə SSE necə tətbiq edilir

Serverdə SSE tətbiqi kitabxana tələb etmir — düzgün HTTP başlıqlarını təyin etmək və məlumatları text/event-stream formatında göndərmək kifayətdir. Daxili http modulundan istifadə edərək Node.js nümunəsinə baxaq. Server Content-Type və Cache-Control başlıqlarını təyin edir, sonra hər N saniyədən bir mesaj göndərir.

MDN Web Docs (2025) məlumatlarına görə, SSE üçün məcburi başlıqlar: Content-Type: text/event-stream, Cache-Control: no-cache və Connection: keep-alive. Cache-Control olmadan brauzer SSE axınını keşləyə bilər, bu da çatdırılmanın dayanmasına səbəb olar. Connection: keep-alive brauzerə bağlantını açıq saxlamağı açıq şəkildə göstərir.

Node.js server kodu

js
const http = require('http');

http.createServer((req, res) => {
    res.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
    });

    let eventId = 0;
    const interval = setInterval(() => {
        eventId++;
        res.write(`id: ${eventId}\n`);
        res.write(`event: update\n`);
        res.write(`data: {"vaxt": "${new Date().toISOString()}", "id":${eventId}}\n\n`);
    }, 2000);

    req.on('close', () => {
        clearInterval(interval);
    });
}).listen(3000);

Python (Flask) ilə SSE

python
from flask import Response, Flask
import time
import json

app = Flask(__name__)

@app.route('/stream')
def stream():
    def generate():
        event_id = 0
        while True:
            event_id += 1
            data = json.dumps(
                {'ticker': 'AAPL', 'price': 150.25})
            yield f'id: {event_id}\nevent: price\ndata: {data}\n\n'
            time.sleep(1)
    return Response(generate(),
        mimetype='text/event-stream')

Mobil tətbiqlərdə SSE

Mobil tətbiqlərdə SSE istifadəsi iOS və Android üçün EventSource-un yerli tətbiqinin olmaması ilə məhdudlaşır. Mobil platformalarda SSE xarici kitabxanalar vasitəsilə tətbiq edilir: iOS-da — URLSession ilə NSURLProtocol, Android-də — OkHttp ilə SSE dəstəyi (okhttp-sse). React Native və Flutter üçün EventSource-u emulyasiya edən paketlər mövcuddur.

iOS-da yerli SSE tətbiqi URLSessionDataDelegate vasitəsilə mümkündür. urlSession(_:dataTask:didReceive:) metodunda məlumat qəbul edərkən tətbiq bufer toplayır və event-stream formatını əl ilə pars edir. iOS inkişaf bloguna (2024) görə, iOS-da SSE ilə batareya istehlakı daimi WebSocket bağlantısından 40% aşağıdır, heartbeat paketlərinin olmaması səbəbindən.

Android-də OkHttp SSE axınlarına abunə olmaq üçün EventSource.Factory sinfini təqdim edir. Android tətbiqləri FSM əlçatan olmadıqda bildirişlər üçün və ya fon rejimində məlumat sinxronizasiyası üçün SSE-dən istifadə edə bilər. Android-də SSE uzun müddətli fon tapşırıqları üçün WorkManager ilə yaxşı işləyir. OkHttp sənədləşməsinə (2025) görə, okhttp-sse xüsusi listener ilə avtomatik yenidən qoşulmanı dəstəkləyir.

Tez-tez verilən suallar

SSE WebSocket-dən nə ilə fərqlənir?

SSE — HTTP üzərindən birtərəfli ötürmə (server → klient), klient tərəfində kitabxana tələb etmir. WebSocket — ikili protokolla ikitərəfli ötürmə. SSE tətbiqdə daha sadədir, WebSocket klientin də məlumat göndərdiyi tapşırıqlar üçün uyğundur.

SSE ikili məlumatları dəstəkləyirmi?

Xeyr, SSE yalnız mətn məlumatlarını ötürür. İkili məlumatlar (şəkillər, audio) üçün Base64 kodlaşdırması tələb olunur ki, bu da ölçüsü 33% artırır. İkili axınlar üçün WebSocket istifadə etmək daha yaxşıdır.

SSE bağlantı qırılmalarını necə idarə edir?

EventSource qırılma zamanı avtomatik olaraq yenidən qoşulur. Gecikmə vaxtı axındakı retry sahəsi ilə təyin edilir (standart olaraq 1000 ms). Yenidən qoşulma zamanı brauzer Last-Event-ID başlığını göndərir ki, bu da serverə axını kəsildiyi yerdən bərpa etməyə imkan verir.

Brauzer neçə SSE bağlantısı saxlaya bilər?

Hər brauzerin bir domenlə eyni vaxtda HTTP bağlantılarının sayı məhdudiyyəti var. HTTP/1.1 üçün — bir domenə 6–8 bağlantı, HTTP/2 üçün — 100-ə qədər. SSE bir bağlantı istifadə edir, buna görə digər sorğularla rəqabət yaranmır.

SSE söhbət üçün istifadə edilə bilərmi?

SSE yalnız mesaj qəbul etmək üçün uyğundur (daxil olan). Mesaj göndərmək (çıxan) üçün ayrıca HTTP sorğusu (POST) tələb olunur. Tam söhbət üçün bir bağlantıda ikitərəfli əlaqə ilə WebSocket və ya Socket.IO istifadə etmək daha rahatdır.

Nəticə

  • SSE — əlavə kitabxanalar olmadan adi HTTP bağlantısı vasitəsilə serverdən klientə birtərəfli məlumat ötürmə standartı.
  • EventSource API — müasir brauzerlərin 97,5%-i tərəfindən dəstəklənən daxili brauzer interfeysi.
  • Sadə mətn protokolu text/event-stream event, data, id və retry sahələri ilə.
  • Avtomatik yenidən qoşulma axını kəsildiyi yerdən bərpa etmək üçün Last-Event-ID dəstəyi ilə.
  • Səmərəlilik — SSE daha sadə protokola görə WebSocket-lə müqayisədə serverdə daha çox bağlantı (50 000+) dəstəkləyir.
  • Mobil platformalarda SSE OkHttp (Android) və ya URLSession (iOS) ilə axının əl ilə pars edilməsi ilə tətbiq edilir.
  • Birtərəfli axınlar üçün (bildirişlər, lentlər, tickerlər) SSE seçin, ikitərəfli əlaqə üçün — WebSocket və ya Socket.IO.

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.

Layihəni müzakirə et

Həm də oxuyun