WebSockets и SSE
1) Gysgaça: näme we näme üçin
WebSocket (WS/WSS) - doly dupleksli kanala HTTP-baglanyşygy täzelemek. Söhbetdeşlikler, göni oýunlar, hyzmatdaşlyk, iki taraplaýyn telemetriýa üçin amatlydyr.
Server-Sent Events (SSE) - serwerden brauzere (MIME 'text/event-stream') bir taraplaýyn akym. Tikerler, habarnamalar, sitatalar, wezipeleriň ösüşi üçin amatlydyr. Müşderi - "EventSource".
- Müşderiden hakyky wagtda giriş gerek (köplenç we köp) → WebSocket.
- Diňe serwerden täzelenmeler, laýyklyk we ýönekeýlik has möhümdir → SSE.
2) Tor we teswirnamalar
2. 1 Ulag we laýyklyk
WebSocket: HTTP 'GET... Upgrade: websocket` (HTTP/1. 1). HTTP/2 üçin RFC 8441 (CONNECT + ': protocol = websocket') mümkindir, goldaw proksisine baglydyr. TLS (WSS) üstünde işleýär - hökmanydyr.
SSE: akym bilen adaty uzyn HTTP jogap ('200 OK'). Gowy gidýär HTTP/1. 1/2/3, CDN/proxy bilen gabat gelýär (uzyn konektleri kesmese).
2. 2 Proxy/balanslaýjylar/CDN
Barlaň: uzak möhletli baglanyşyklary, idlalary we wagtlary, sticky-sessiýalary goldaýar (eger ýagdaý düwünde bolsa).
WS üçin: 'proxy _ read _ timeout', 'upgrade' -başlyklary, per-baglanyşyk çäklerini açyň.
SSE üçin: Proxy jogap berýändigine göz ýetiriň (ýogsam müşderi wakalary wagtynda görmez).
3) Habarlaryň modeli we akymyň dolandyrylyşy
WebSocket: tekst ýa-da ikilik çarçuwalar; 'ping/pong' bar, ýöne gurlan backpressure ýok - programmada (nobatlar, penjireler, drop-policy) durmuşa geçiriň.
SSE: tekst wakalary (UTF-8); müşderi gijikdirmek bilen reconnect goýmagy bilýär; serwer 'retry:' diýip sorap biler. 'Id:' we 'Last-Event-ID' sözbaşy islenýän ýerden täzeden başlamak üçin bar.
- Gidýän habarlaryňyza per-müşderi kwotasyny beriň.
- Iberilmedik wakalaryň nobatyny çäklendiriň; artykmaç bolanda - pes prioritetliligini taşlamak/jemlemek.
- WS üçin: programma derejesinde "süýşýän penjire" we ACK shemasyny ulanyň.
4) Baglanyşyklaryň ygtybarlylygy
4. 1 Deteksiýa we keepalive
WS: Her N sekuntda 'ping' iberiň; wagt aralygy - reconnect bilen eksponensial backoff + jitter.
SSE: serwer "teswirleri" iberýär ':\n' baglanyşygy idle hasaplamaz ýaly heartbeat hökmünde; müşderiniň özi birikdiriler.
4. 2 Akymy dikeltmek
WS: offset/sequence habarlaryňyzy saklaň we reconnect-den soň deltany soraň.
SSE: Her bir waka üçin 'id:' we soragdaky 'Last-Event-ID' -ni ulanyň - serwer sypdyrylan wakalary iberýär.
5) Tassyklamak we ygtyýarlandyrmak
JWT Bearer (WS) soragynyň URL-sinde howpsuz däl. "Secure", "HttpOnly", "SameSite" baýdakly kukileri ulanyň.
mTLS (esasanam B2B üçin), şeýle hem gollar (HMAC) asyl haýyşyň üstünde bolup biler.
Çerezler bilen SSE üçin CORS ('Access-Control-Allow-Origin', 'Allow-Credentials') hakda ýadyňyzdan çykarmaň.
Tokeniň aýlanmagy: akymy kesmäň. "Ýakyn wagtda gutarýar" diýiň → müşderi täze belgi bilen baglanyşygy açar.
6) Maglumatlaryň formaty we gysyş
WebSocket: permessage-deflate-i seresaplylyk bilen açyň (CPU); eýýäm gysylan formatlaryň (Proto, Euro) gysylmagyndan gaça duruň. JSON-dan has tygşytly.
SSE: Bu tekst; uly maglumatlar üçin REST/gRPC çeşmesine ýa-da çunk faýllaryna baglanyşyk iberiň; SSE üçin transport gzip - ýerlikli, ýöne proxy/CDN-de buferizasiýa gözegçilik ediň.
7) Masştab we janköýer
7. 1 Gorizontal masştab
Programmany täzeden başlamakda päsgelçiliksiz saklaň. Birleşmeleriň ýagdaýy - öň gatlakda; maglumatlar - dellaldan.
Lokal nobatlar bar bolsa, Sticky (session/user hash) gerek.
Ideal - stateless öň: düwün diňe abunalyklary köpeldýär; wakalar umumy pub/sub-dan gelýär.
7. 2 Pub/Sub we brokerler
Giň janköýer çykyşy üçin Kafka/NATS/Redis Streams ulanyň.
"Fanout Gateway" Gateway topiklere ýazylýar we WS/SSE boýunça müşderilere basylýar.
Nodlaryň arasyndaky ýükleri deňleşdirmek üçin marşrut açaryny ('userId', 'matchId') ulanyň.
8) Önümçilik konfiguralary
8. 1 NGINX — WebSocket
nginx map $http_upgrade $connection_upgrade { default upgrade; '' close; }
server {
listen 443 ssl http2;
server_name ws. example. com;
location /ws {
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1. 1;
proxy_read_timeout 75s; # increase for long sessions proxy_send_timeout 15s;
proxy_pass http://ws-backend;
}
}
8. 2 NGINX - SSE (buferizasiýany öçürmek möhümdir)
nginx location /events {
proxy_http_version 1. 1;
proxy_set_header Connection "";
proxy_buffering off; # is critical for proxy_cache off threads;
chunked_transfer_encoding on;
proxy_read_timeout 60m;
proxy_pass http://sse-backend;
}
8. 3 Kubernetes (Ingress Annotations, NGINX Ingress)
yaml metadata:
annotations:
nginx. ingress. kubernetes. io/proxy-read-timeout: "3600"
nginx. ingress. kubernetes. io/proxy-send-timeout: "3600"
nginx. ingress. kubernetes. io/enable-websocket: "true"
nginx. ingress. kubernetes. io/proxy-buffering: "off" # для SSE
9) Kod mysallary
9. 1 SSE müşderisi (brauzer)
js const es = new EventSource("/events? channel=odds", { withCredentials: true });
es. addEventListener("message", (e) => {
const data = JSON. parse(e. data);
renderOdds(data);
});
es. addEventListener("error", () => {
//EventSource will reconnect itself; can be shown spinner
});
9. 2 SSE serweri (Node. js/Express)
js app. get('/events', (req, res) => {
res. writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
});
res. write ('retry: 3000\n\n') ;//3s backoff to client
const sub = subscribe(req. query. channel, (event) => {
res. write(`id: ${event. id}\n`);
res. write(`event: message\n`);
res. write(`data: ${JSON. stringify(event. payload)}\n\n`);
});
req. on('close', () => sub. unsubscribe());
});
9. 3 WebSocket müşderisi
js const ws = new WebSocket("wss://ws. example. com/ws");
ws. onopen = () => ws. send(JSON. stringify({ type: "join", room: "chat-1" }));
ws. onmessage = (m) => handle(JSON. parse(m. data));
ws. onclose = () => scheduleReconnect();
10) Howpsuzlyk we çäklendirme
Rate limiting per-baglanyşyk we per-ulanyjy: Gelýän habarlaryň ýygylygyny (WS) we çykýan akymyň tizligini (WS/SSE) çäklendiriň.
Baglanyşygyň ömrüne we umumy traffige görä quota.
Message size limit и max messages/sec.
hendşeýk tapgyrynda WAF/bot-süzgüçler; connection flooding goragy (gysga konektleriň köpüsi).
tenant/namespace boýunça izolýasiýa: aýry-aýry çeşme howuzlary.
11) Gözegçilik etmek
Metrikler:- `connections_active`, `connections_new_total`, `bytes_in/out`,
- `messages_in/out_total`, `dropped_messages_total`,
- `reconnects_total`, `latency_delivery_ms{p50,p95,p99}`.
- Girişler: IP/UA, userId/tenantId, ýapylyş sebäbi ('close _ code'), dowamlylygy.
- Treýsing: wakalary başlangyç topar bilen baglanyşdyryň (korrelýasiýa ID); WS üçin "wirtual" tüpeňleri ulanyň.
12) Ekspluatasiýa nuanslary
TLS terminasiýasy müşderä has ýakyn (CDN/edge).
Deplolarda birleşmeleriň işjeň aýlanmagy (graceful): baýdagy "täzeden birikdiriň".
"Gyzgyn" kanallary deň paýlamak üçin açar boýunça şardlamak.
Giç abonentler üçin ýagdaý suratlary (snapshot + delta).
Iň soňky bahaly keş (SSE) - "sowuk" müşderi üçin peýdalydyr.
13) Anti-patternler
SSE ýa-da JSON arkaly WS arkaly uly goşa bölekleri akdyrmak - HTTP ýüklemesini we habardaky baglanyşygy ulanyň.
Diňe birikdirilen pursatda ygtyýarnama bermek we uzyn sessiýalarda gaýtadan barlaglaryň bolmazlygy.
Zerurlyksyz global sticky → deňsizlik we "gyzgyn" nodlar.
Öçürilen wagt/çäkler → asylan konektler howuzy iýýär.
SSE proxy/CDN → "hakyky wagt" buferizasiýasy gijikdirilen minutlara öwrülýär.
sequence/offset → ýoklugy reconnect müşderiden soň maglumatlaryň bitewiligini ýitirýär.
14) Girizmegiň çek-sanawy
- Model saýlandy: WS (iki taraplaýyn) ýa-da SSE (bir taraplaýyn).
- Wagt, keepalive we reconnect (backoff + jitter) sazlandy.
- Sequence/offset we (SSE üçin) 'id '/' Last-Event-ID'.
- Çäklendirmeler kesgitlenildi: ululygy/tizligi/baglanyşyklary/kwotalary, DoS-den goramak.
- Proksi/Ingress: upgrade, proxy_buffering off (SSE), read/send timeouts.
- Masştab: pub/sub-broker, janköýer-çykalga, diňe zerur bolanda sticky.
- Autentification: tokeniň howpsuz geçirilmegi, döwülmezden aýlanmagy.
- Syn edilişi: metrikler, çukurlar, ýollar; daşbordlar we alertler.
- Goýberiş meýilnamasy: graceful-drain baglanyşyklary, müşderä gaýtadan birikdirmek barada signal.
- Oýun günleri: toruň kesilmegi, nodanyň ýykylmagy, dellalyň aşa ýüklenmegi, uzyn RTT.
15) FAQ
SSE CDN arkaly kesmek mümkinmi?
Adatça ýok: bu şahsylaşdyrylan akym. Jemgyýetçilik kanallary üçin - belki gysga TTL we chunked-delivery bilen, ýöne "hakyky wagty" bozmak aňsat.
WebSocket HTTP/2/3 üstünde işleýärmi?
WS brauzer HTTP/1 başlaýar. 1-upgrade; h2 üçin RFC 8441 bar, proxy/serwerde goldaw aýratyn talap edilýär. C h3 - hereketde; h3-de akym üçin WebTransport bar, ýöne bu başga bir API.
gRPC vs WS brauzer üçin?
Arassa brauzer gRPC diýmez; gRPC-Web Envoy arkaly gerek. Interaktiw UI üçin köplenç WS + REST has aňsat.
16) Netijeler
WebSocket - hakyky wagtda gepleşik we ykjam iki taraplaýyn kanal gerek bolanda.
SSE - serwerden müşderä ýönekeý we ygtybarly push gerek bolanda, minimal çylşyrymlylyk we awtomatiki reconnect.
Önümçilikde üstünlik dogry wagtlar we çäkler, offsetden dikeldiş, pub/sub-janköýerlik, dogry proxy sazlamalary we aýdyň gözegçilik.