WebSockets и SSE
1) संक्षिप्त: क्या और क्या के लिए
WebSocket (WS/WSS) - HTTP कनेक्शन अपग्रेड पूर्ण डुप्लेक्स चैनल पर। चैट, लाइव गेम, सहयोग, द्विदिश टेलीमेट्री के लिए उपयुक्त।
सर्वर-भेजी गई घटनाएँ (SSE) - सर्वर से ब्राउज़र तक एकतरफा स्ट्रीम (MIME 'text/event-stream'). टिकर, सूचनाएं, उद्धरण, कार्य प्रगति के लिए आदर्श। क्लाइंट - 'EventSource'।
चयन नियम:- आपको वास्तविक समय (अक्सर बहुत) → WebSocket में क्लाइंट से इनपुट की आवश्यकता है।
- केवल सर्वर से अपडेट, संगतता और सादगी SSE → से अधिक महत्वपूर्ण हैं।
2) नेटवर्क और प्रोटोकॉल
2. 1 परिवहन और संगतता
WebSocket: HTTP 'GET... अद्यतन: वेबसाइट '(HTTP/1। 1). HTTP/2 के लिए, RFC 8441 (CONNECT + ': प्रोटोकॉल = वेबसाइट') संभव है, समर्थन प्रॉक्सी पर निर्भर करता है। टीएलएस (डब्ल्यूएसएस) के शीर्ष पर काम करता है - बिक्री में अनिवार्य।
एसएसई: स्ट्रीमिंग के साथ सामान्य लंबी एचटीटीपी प्रतिक्रिया ('200 ओके')। यह HTTP/1 के माध्यम से अच्छी तरह से जाता है। 1/2/3, सीडीएन/प्रॉक्सी के साथ संगत (यदि लंबे कनेक्शन समाप्त नहीं हुए हैं)।
2. 2 प्रॉक्सी/बैलेंसर/सीडीएन
जाँच करें: लंबे समय तक जीवित कनेक्शन, निष्क्रियता और टाइमआउट, चिपचिपा सत्र (यदि राज्य नोड पर है) के लिए समर्थन।
WS के लिए: 'प्रॉक्सी _ read _ timeout', 'अपग्रेड' हेडर, प्रति-कनेक्शन सीमा शामिल करें।
एसएसई के लिए, सुनिश्चित करें कि प्रॉक्सी प्रतिक्रिया को बफर नहीं करता है (अन्यथा क्लाइंट समय में घटनाओं को नहीं देखेगा)।
3) संदेश मॉडल और प्रवाह नियंत्रण
वेबसॉकेट: पाठ या द्विआधारी फ्रेम; एक 'पिंग/पोंग' है, लेकिन कोई अंतर्निहित बैकप्रेशर नहीं है - एप्लिकेशन (कतारें, खिड़कियां, ड्रॉप-पॉलिसी) पर लागू करें।
एसएसई: पाठ घटना (यूटीएफ -8); ग्राहक निर्मित देरी के साथ फिर से जुड़ ने में सक्षम है; सर्वर 'रेट्री:' निर्दिष्ट कर सकता है। वांछित स्थिति से फिर से शुरू करने के लिए एक 'id:' और 'लास्ट-इवेंट-आईडी' हेडर है।
बैकप्रेशर (सामान्य प्रथाएं):- प्रति क्लाइंट आउटगोइंग संदेश उद्धृत करें।
- असंतुष्ट घटनाओं की कतार को सीमित करें; अतिप्रवाह पर - कम प्राथमिकता/कुल को त्याग दें।
- WS के लिए, एक स्लाइडिंग विंडो और एक एप्लिकेशन-लेवल ACK का उपयोग करें।
4) कनेक्शन की विश्वसनीयता
4. 1 का पता लगाना और रखवाली करना
WS: हर N सेकंड में 'पिंग' भेजें; टाइमआउट गैप - घातीय बैकऑफ + जिटर के साथ फिर से जुड़ें।
SSE: सर्वर दिल की धड़ कन के रूप में "टिप्पणियां": 'n' भेजता है ताकि कनेक्शन निष्क्रिय न हो; ग्राहक खुद को फिर से जोड़ेगा।
4. 2 प्रवाह वसूली
WS: ऑफसेट/अनुक्रम संदेश रखें और फिर कनेक्ट करने के बाद डेल्टा निवेदन करें।
एसएसई: प्रत्येक घटना के लिए 'आईडी:' का उपयोग करें और अनुरोध में 'लास्ट-इवेंट-आईडी' - सर्वर चूक घटनाओं को भेजता है।
5) प्रमाणीकरण और प्राधिकरण
अनुरोध URL (WS) में JWT वाहक असुरक्षित है (लॉग में लीक)। हेडर (प्राथमिक HTTP हैंडशेक के माध्यम से) या 'सुरक्षित', 'Httpony', 'SempSite' के साथ कुकीज़का उपयोग करें।
mTLS (विशेष रूप से B2B के लिए) संभव है, साथ ही मूल अनुरोध पर हस्ताक्षर (HMAC) भी।
कुकीज़के साथ एसएसई के लिए, CORS ('एक्सेस-कंट्रोल-अनुमति-उत्पत्ति', 'अनुमति-क्रेडेंशियल्स') के बारे में याद रखें।
टोकन रोटेशन: धारा को न काटें। पास "जल्द ही समाप्त हो जाएगा" - ग्राहक नए टोकन के साथ कनेक्शन को फिर से खोल देगा।
6) डेटा प्रारूप और संपीड़न
WebSocket: ध्यान से अनुमति-विक्षेपण सक्षम करें (CPU); पहले से ही संपीड़ित प्रारूपों (प्रोटो, एवरो) के संपीड़न से बचें। बाइनरी पेलोड JSON की तुलना में अधिक किफायती है।
एसएसई: यह पाठ है; बड़े डेटा के लिए, REST/gRPC संसाधन या चंक फ़ाइलों के लिए एक लिंक भेजें; SSE के लिए ट्रांसपोर्ट gzip - उपयुक्त, लेकिन प्रॉक्सी/सीडीएन में बफरिंग के लिए देखें।
7) स्केलिंग और फैन-आउट
7. 1 क्षैतिज स्केलिंग
पुनरारंभ के लिए एप्लिकेशन दोष मुक्त रखें। कनेक्शन स्थिति - सामने की परत में; डेटा - दलाल से।
यदि स्थानीय कतारें हैं तो स्टिकी (सत्र/उपयोगकर्ता द्वारा हैश) की आवश्यकता है।
आदर्श स्टेटलेस फ्रंट है: नोड केवल मल्टीप्लेक्स सदस्यता; घटनाएं एक आम पब/उप से आती हैं।
7. 2 पब/उप और दलालों
एक विस्तृत फैन-आउट के लिए, काफ्का/एनएटीएस/रेडिस स्ट्रीम का उपयोग करें।
"फैनआउट गेटवे" परत डब्ल्यूएस/एसएसई के माध्यम से विषयों और प्रवाह ग्राहकों की सदस्यता लेती है।
एक रूटिंग कुंजी का उपयोग करें (उदाहरण के लिए, 'useId', 'machId') नोड्स के बीच लोड को संतुलित करने के लिए।
8) उत्पादन कॉन्फ़िग
8. 1 NGINX - वेबसॉकेट
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 (बफरिंग को निष्क्रिय करने के लिए महत्वपूर्ण)
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 कुबर्नेट्स (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) कोड उदाहरण
9. 1 एसएसई क्लाइंट (ब्राउज़र)
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 एसएसई सर्वर (नोड। जेएस/एक्सप्रेस)
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 वेबसॉकेट क्लाइंट (ब्राउज़र)
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) सुरक्षा और सीमित
प्रति-कनेक्शन और प्रति-उपयोगकर्ता को सीमित करने की दर: आने वाले संदेशों (WS) की दर और आउटगोइंग प्रवाह (WS/SSE) की दर को सीमित करें।
कनेक्शन जीवनकाल और कुल यातायात द्वारा कोटा।
संदेश आकार सीमा и अधिकतम संदेश/सेकंड।
हैंडशेक चरण में WAF/बॉट फिल्टर; कनेक्शन बाढ़ के खिलाफ सुरक्षा (कई छोटे कनेक्शन)
किरायेदार/नेमस्पेस अलगाव: व्यक्तिगत संसाधन पूल।
11) अवलोकन क्षमता
मेट्रिक्स:- 'कनेक्शन _ सक्रिय', 'कनेक्शन _ न्यू _ टोटल', 'बाइट्स _ इन/आउट',
- 'messages _ in/out _ tomal', 'deft _ messages _ total',
- 'रीकनेक्ट्स _ टोटल', 'लेटेंसी _ डिलीवरी _ ms {p50, p95, p99}'।
- लॉग: IP/UA, userId/tenantId, बंद करने का कारण ('cost _ code'), अवधि.
- ट्रेसिंग: मूल कमांड (सहसंबंध आईडी) के साथ सहयोगी घटनाएं; डब्ल्यूएस के लिए, "वर्चुअल" कसाई स्पैन का उपयोग करें।
12) परिचालन बारीकियां
क्लाइंट (CDN/edge) के करीब TLS समाप्ति।
कनेक्शन का सक्रिय रोटेशन (सुंदर) कमी के दौरान: ध्वज को "फिर से जोड़ें"।
"हॉट" चैनलों को समान रूप से वितरित करने के लिए कुंजी पर शेयरिंग।
देर से ग्राहकों के लिए स्थिति स्नैपशॉट (स्नैपशॉट + डेल्टा)।
अंतिम मान कैश (एसएसई विशेष रूप से) - ठंडा क्लाइंट के लिए उपयोगी।
13) एंटी-पैटर्न
WS पर SSE या JSON के माध्यम से बड़े बाइनरी चंक स्ट्रीम करें - संदेश में HTTP डाउनलोड और लिंक का उपयोग करें।
केवल कनेक्शन के समय प्राधिकरण और लंबे सत्रों के लिए फिर से जांच की अनुपस्थिति।
वैश्विक चिपचिपा अनावश्यक - असंतुलन और गर्म नोड्स।
विकलांग टाइमआउट/लिमिट - जमे हुए कनेक्शन पूल को खाते हैं।
एसएसई प्रॉक्सी/सीडीएन बफरिंग - "वास्तविक समय" देरी के मिनट बन जाता है।
अनुक्रम/ऑफसेट की कमी - फिर से जुड़ ने के बाद, क्लाइंट डेटा अखंडता खो देता है।
14) कार्यान्वयन चेकलिस्ट
- डब्ल्यूएस (द्विदिश) या एसएसई (एकतरफा) का चयन किया जाता है।
- कॉन्फ़िगर किए गए टाइमआउट, कीपालिव और फिर से जुड़ें (बैकऑफ़ + जिटर)।
- अनुक्रम/ऑफसेट और (एसएसई के लिए) 'आईडी '/' लास्ट-इवेंट-आईडी'।
- आकार/गति/कनेक्शन/कोटा, डॉस सुरक्षा परिभाषित।
- प्रॉक्सी/इंग्रेस कॉन्फ़िग: अपग्रेड, proxy_buffering off (SSE), पढ़ें/भेजें टाइमआउट।
- स्केलिंग: पब/सब ब्रोकर, फैन-आउट गेटवे, केवल जरूरत पड़ ने पर चिपचिपा।
- प्रमाणीकरण: सुरक्षित टोकन हस्तांतरण, नो-ब्रेक रोटेशन।
- अवलोकन: मैट्रिक्स, लॉग, निशान; डैशबोर्ड और अलर्ट।
- रिलीज़ प्लान: सुंदर-नाली कनेक्शन, ग्राहक को फिर से जुड़ ने का संकेत दें।
- गेम डेज़: नेटवर्क ब्रेक, नोड ड्रॉप, ब्रोकर ओवरलोड, लंबे आरटीटी।
15) एफएक्यू
क्या सीडीएन के माध्यम से एसएसई को कैश किया जा सकता है?
आमतौर पर नहीं: यह एक व्यक्तिगत प्रवाह है। सार्वजनिक चैनलों के लिए - संभवतः छोटे टीटीएल और चंक-डिलीवरी के साथ, लेकिन "वास्तविक समय" को तोड़ ना आसान है।
क्या वेबसॉकेट HTTP/2/3 के शीर्ष पर काम करता है?
ब्राउज़र WS HTTP/1 से शुरू होता है। 1-उन्नयन; h2 के लिए RFC 8441 है, प्रॉक्सी/सर्वर में समर्थन अलग से आवश्यक है। h3 - इन गति के साथ; स्ट्रीमिंग के लिए, h3 में वेबट्रांसपोर्ट है, लेकिन यह एक अलग एपीआई है।
ब्राउज़र के लिए gRPC बनाम WS?
एक साफ ब्राउज़र जीआरपीसी नहीं कहता है; दूत के माध्यम से gRPC-वेब की आवश्यकता है। इंटरैक्टिव यूआई के लिए, डब्ल्यूएस + आरईएस अक्सर आसान होता है।
16) कुल
वेबसॉकेट - जब आपको वास्तविक समय के संवाद और एक कॉम्पैक्ट द्विदिश चैनल की आवश्यकता होती है।
SSE - जब आपको सर्वर से क्लाइंट तक एक सरल और विश्वसनीय पुश की आवश्यकता होती है, तो न्यूनतम जटिलता और स्वचालित पुनर्संयोजन।
बिक्री में सफलता सही समय और सीमा है, ऑफसेट से वसूली, पब/सब फैन-आउट, सही प्रॉक्सी सेटिंग्स और स्पष्ट अवलोकन।