שקעי אינטרנט NAME OF TRANSLATORs
1) קיצור: מה ובשביל מה
Socket (WS/WSS) - שדרוג חיבור HTTP לערוץ דופלקס מלא. מתאים לשיחות, משחקים חיים, שיתוף פעולה, טלמטריה דו כיוונית.
אירועים שנשלחו על ידי השרת (SSE) - זרם בכיוון אחד מהשרת לדפדפן (MIME 'text'/event-stream'). אידיאלי עבור דגנים, הודעות, ציטוטים, התקדמות משימה. לקוח - ”מקור האירוע”.
- צריך קלט מהלקוח בזמן אמת (לעתים קרובות הרבה).
- רק עדכוני דחיפה מהשרת, תאימות ופשטות חשובים יותר מSSE.
2) רשת ופרוטוקולים
2. 1 הובלה ותאימות
שקע רשת: מתחיל כמו HTTP 'GET... שדרוג: אתר אינטרנט "(HTTP/1. 1). עבור HTTP/2, RFC 8441 (CONNECT + ': פרוטוקול = אתרי אינטרנט' oket ') אפשרי, תמיכה תלויה במיופה הכוח. עובד על גבי TLS (WSS) - חובה במכירות.
SSE: תגובת HTTP ארוכה רגילה ('200 OK') עם הזרמה. זה הולך טוב דרך HTTP/1. 1/2/3, תואם עם CDN/proxy (אם קשרים ארוכים לא נפסקו).
2. 2 פרוקסי/מאזנים/CDN
בדוק: תמיכה בקשרים ארוכי-ימים, בטלות ופסקי-זמן, הפעלות דביקות (אם המדינה נמצאת בצומת).
עבור WS: כלול את "proxy _ read _ timeout', ראשי" שדרוג ", מגבלות לכל חיבור.
עבור SSE, ודא כי המתווך אינו חוצץ את התגובה (אחרת הלקוח לא יראה את האירועים בזמן).
3) מודל הודעה ובקרת זרימה
שקע רשת: טקסט או מסגרות בינאריות; יש ”פינג/פונג”, אבל אין רזרבה מובנית - ליישם על היישום (תורים, חלונות, מדיניות ירידה).
SSE: טקסט אירועים (UTF-8); הלקוח מסוגל להתחבר מחדש עם עיכוב מובנה; השרת יכול לציין: ””. יש ”יד:” ו ”אחרון-אירוע-זיהוי” כותרת לחדש מן המיקום הרצוי.
- ציטוט הודעות יוצאות ללקוח.
- הגבל את התור של אירועים לא נכונים; על עודף - להיפטר בעדיפות נמוכה/צבירה.
- עבור WS, השתמש בחלון הזזה ו-ACK ברמת יישום.
4) מהימנות הקשרים
4. זיהוי ושמירה של 1
ו: שלח פינג כל N שניות; פער זמן - להתחבר מחדש עם גיבוי מעריכי + jitter.
SSE: השרת שולח ”הערות” :\n' כפעימת לב כך שהחיבור אינו נחשב בטל; הלקוח יתחבר מחדש.
4. 2 התאוששות זרימה
WS: שמור הודעות קיזוז/רצף ובקש דלתא לאחר חיבור מחדש.
SSE: השתמש ב-id: ”לכל אירוע ו-last-Event-ID” בבקשה - השרת שולח אירועים שלא נענו.
5) אימות ואישור
JWT Bearer בקשת URL (WS) הוא חסר ביטחון (הדלפות ביומנים). השתמש בכותרת (דרך לחיצת היד הראשונית של HTTP) או בעוגיות עם הדגלים ”Secure”, ”HttpOnly”, ”Grieft Site”.
MTLS (במיוחד עבור B2B) אפשרי, כמו גם חתימה (HMAC) על הבקשה המקורית.
עבור SSE עם עוגיות, זכור על CORS ('Access-Control-Low-Origin', 'Low-Representials').
סיבוב טוקן: אל תחתוך את הנחל. Pass ”יפוג בקרוב” = הלקוח יפתח מחדש את הקשר עם האסימון החדש.
6) תבנית מידע ודחיסה
שקע Websket: אפשר פרישה-דפלט בזהירות (CPU); הימנע מדחיסה של פורמטים דחוסים (פרוטו, אברו). מטען בינארי הוא יותר חסכוני מאשר JSON.
SSE: זהו טקסט; עבור נתונים גדולים, שלח קישור למשאב REST/gRPC או קבצי נתחים; Transport Gzip עבור SSE - מתאים, אבל שים לב לחציצה של פרוקסי/CDN.
7) התאמות ומאוורר
7. 1 סולם אופקי
שמור את האפליקציה ללא פגם עבור הפעלה מחדש. מצב חיבור - בשכבה הקדמית; נתונים מהברוקר.
דביק (חשיש על ידי סשן/משתמש) נחוץ אם יש תורים מקומיים.
האידיאל הוא החזית חסרת המדינה: הצומת רק מרובה מנויים; אירועים באים מפאב/צוללת משותף.
7. 2 פאב/תת וברוקרים
למאוורר רחב, להשתמש קפקא/NATS/רדיס סטרמס.
שכבת השער של Fanout מנויה לנושאים וללקוחות דרך WS/SSE.
השתמש במפתח ניתוב (לדוגמה, ”averId',” matchId') כדי לאזן את העומס בין צמתים.
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 SSE (דפדפן)
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 (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 לקוח שקע אינטרנט (דפדפן)
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/BOT בשלב לחיצת היד; הגנה מפני הצפות (קשרים קצרים רבים).
בידוד דייר/שם: בריכות משאבים בודדות.
11) יכולת תצפית
מדדים:- 'connections _ active', 'קשרים _ new _ total', 'bytes _ in/out',
- 'messages _ in/out _ total', 'dised _ smels _ total',
- ”מתחבר מחדש _ סך הכל”, ”latency _ delever _ ms _ p50, p95, p99”.
- יומנים: IP/UA, ServantID/Tenantid, סיבה לסגירה (”close _ code”), משך.
- התחקות: לקשר אירועים עם הפקודה המקורית (זיהוי מתאם); עבור WS, להשתמש ”וירטואלי” מרווח בוץ '.
12) ניואנסים מבצעיים
סיום TLS קרוב יותר ללקוח (CDN/edge).
סיבוב פרואקטיבי של חיבורים (חינניים) במהלך דלדול: תן לדגל ”להתחבר מחדש”.
לדחוף את המפתח להפצת ערוצים ”חמים” באופן שווה.
צילומי מצב למנויים מאוחרים (צילום + דלתא).
מטמון ערך אחרון (SSE במיוחד) שימושי ללקוח קר.
13) אנטי דפוסים
הזרם נתחים בינאריים גדולים באמצעות SSE או JSON מעל WS - השתמש בהורדת HTTP וקישור בהודעה.
אישור רק בזמן החיבור והיעדר בדיקות מחדש לפגישות ארוכות.
דביקות גלובליות ללא צורך. חוסר איזון וצמתים חמים.
פסקי זמן/מגבלות = = חיבורים קפואים אוכלים את הבריכה.
SSE proxy/CDN buzering = ”זמן אמת” הופך לדקות עיכוב.
חוסר ברצף/קיזוז = = לאחר חיבור מחדש, הלקוח מאבד את שלמות המידע.
14) רשימת מימושים
[ ] WS (דו כיווני) או SSE (חד צדדי) נבחר.
[ ] פסקי זמן מוגדרים, לשמור ולהתחבר מחדש (Backoff + jitter).
[ ] תוכנן ברצף/קיזוז ו (עבור SSE) 'id'/' Last-Event-ID'.
[ ] גודל/מהירות/חיבורים/מכסות, הגנת DOS מוגדרת.
[ ] Proxy/Ingress Config: שדרוג, proxy_buffering off (SSE), קריאה/שליחת פסקי זמן.
[ ] סקיילינג: מתווך פאב/תת, שער מאוורר, דביק רק אם צריך.
[ אימות ]: העברת סמלים מאובטחת, סיבוב ללא הפסקה.
[ ] תצפית: מדדים, בולי עץ, עקבות; לוחות מחוונים והתראות.
[ תוכנית שחרור ]: חיבורים חינניים, לאותת ללקוח להתחבר מחדש.
[ ימי משחק ]: הפסקות רשת, צומת טיפות, עומס ברוקרים, RTTs ארוכים.
15) FAQ
האם ניתן לחסום את SSE באמצעות CDN?
בדרך כלל לא, זה זרם מותאם אישית. לערוצים ציבוריים - אולי עם TTL קצר ומשלוח מסומן, אבל זה קל לשבור ”זמן אמת”.
האם שקע רשת עובד על גבי HTTP/2/3?
דפדפן WS מתחיל עם HTTP/1. 1-שדרוג; יש RFC 8441 עבור H2, תמיכה בפרוקסי/שרת נדרשת בנפרד. עם H3 - בתנועה; להזרמה, H3 יש הובלה, אבל זה API שונה.
GRPC נגד WS לדפדפן?
דפדפן נקי לא אומר gRPC; צריך GRPC-Web באמצעות שליח. עבור UIS אינטראקטיבי, WS + REST לעתים קרובות קל יותר.
16) סיכומים
שקע אינטרנט - כאשר אתה צריך דיאלוג בזמן אמת וערוץ דו כיווני קומפקטי.
SSE - כאשר אתה זקוק לדחיפה פשוטה ואמינה משרת ללקוח, מורכבות מינימלית וחיבור אוטומטי.
הצלחה במכירות היא פסקי זמן והגבלות נכונים, התאוששות מהקיזוז, פאב/תת-מאוורר, הגדרות פרוקסי נכונות ויכולת תצפית ברורה.