Logo GH

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".

Saýlamak düzgüni:
  • 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.

Backpressure (umumy amallar):
  • 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.

Contact

Biziň bilen habarlaşyň

Islendik sorag ýa-da goldaw boýunça bize ýazyp bilersiňiz.Biz hemişe kömek etmäge taýýar.

Telegram
@Gamble_GC
Integrasiýany başlamak

Email — hökmany. Telegram ýa-da WhatsApp — islege görä.

Adyňyz obýýektiw däl / islege görä
Email obýýektiw däl / islege görä
Tema obýýektiw däl / islege görä
Habar obýýektiw däl / islege görä
Telegram obýýektiw däl / islege görä
@
Eger Telegram görkezen bolsaňyz — Email-den daşary şol ýerden hem jogap bereris.
WhatsApp obýýektiw däl / islege görä
Format: ýurduň kody we belgi (meselem, +993XXXXXXXX).

Düwmäni basmak bilen siz maglumatlaryňyzyň işlenmegine razylyk berýärsiňiz.