WebSockets и SSE
1) Σύντομη: τι και για τι
WebSocket (WS/WSS) - αναβάθμιση σύνδεσης HTTP σε πλήρες κανάλι duplex. Κατάλληλο για συνομιλίες, ζωντανά παιχνίδια, συνεργασία, αμφίδρομη τηλεμετρία.
Server-Sent Events (SSE) - μονόδρομος ροής από εξυπηρετητή σε περιηγητή (MIME 'text/event-stream'). Ιδανικό για εισπράκτορες, ειδοποιήσεις, εισαγωγικά, πρόοδο εργασιών. Πελάτης - 'EventSource'.
- Χρειάζεστε εισαγωγή από τον πελάτη σε πραγματικό χρόνο (συχνά πολύ) → WebSocket.
- Μόνο οι ενημερώσεις ώθησης από τον εξυπηρετητή, η συμβατότητα και η απλότητα είναι πιο σημαντικές από τις SSE →.
2) Δίκτυο και πρωτόκολλα
2. 1 Μεταφορές και συμβατότητα
WebSocket: Έναρξη ως HTTP 'GET... Αναβάθμιση: websocket '(HTTP/1. 1). Για HTTP/2, RFC 8441 (CONNECT + ': πρωτόκολλο = websocket') είναι δυνατή, η υποστήριξη εξαρτάται από τον διαμεσολαβητή. Εργασίες πέραν του TLS (WSS) - υποχρεωτικές στις πωλήσεις.
SSE: κανονική μακρά απόκριση HTTP ('200 OK') με ροή. Πηγαίνει καλά μέσα από το HTTP/1. 1/2/3, συμβατή με CDN/διαμεσολαβητή (εάν δεν τερματίζονται οι μακρινές συνδέσεις).
2. 2 Πληρεξούσιοι/ισοσκελιστές/CDN
Ελέγξτε: υποστήριξη για μακρόβιες συνδέσεις, ρελαντί και timeouts, κολλώδεις συνεδρίες (αν η κατάσταση είναι στον κόμβο).
Για WS: συμπεριλάβετε 'proxy _ read _ timeout', 'upgrade' headers, per-connection limits.
Για την ΚΑΟ, βεβαιωθείτε ότι ο διαμεσολαβητής δεν ρυθμίζει την απόκριση (διαφορετικά ο πελάτης δεν θα δει τα γεγονότα εγκαίρως).
3) Μοντέλο μηνύματος και έλεγχος ροής
WebSocket: κείμενα ή δυαδικά πλαίσια. υπάρχει ένα 'ping/pong', αλλά δεν υπάρχει ενσωματωμένη αντίθλιψη - εφαρμογή στην εφαρμογή (ουρές, παράθυρα, πολιτική πτώσης).
SSE: εκδηλώσεις κειμένου (UTF-8), ο πελάτης είναι σε θέση να επανασυνδεθεί με καθυστέρηση· ο εξυπηρετητής μπορεί να προσδιορίσει 'retry:'. Υπάρχει ένα 'id:' και ένα 'Last-Event-ID' κεφαλίδα για να επαναληφθεί από την επιθυμητή θέση.
- Εισαγωγή εξερχόμενων μηνυμάτων ανά πελάτη.
- Περιορισμός της σειράς αναμονής μη συμβάντων. σχετικά με την υπερχείλιση - απόρριψη χαμηλής προτεραιότητας/συνολικού όγκου.
- Για WS, χρησιμοποιήστε συρόμενο παράθυρο και ACK επιπέδου εφαρμογής.
4) Αξιοπιστία των συνδέσεων
4. 1 Ανίχνευση και τροφοδοσία
WS: αποστολή 'ping' κάθε δευτερόλεπτο N; κενό χρονισμού - επανασύνδεση με εκθετική εφεδρεία + νευρικότητα.
SSE: ο εξυπηρετητής στέλνει τα «σχόλια» ':\n' ως καρδιακό παλμό έτσι ώστε η σύνδεση να μην μετράει σε αδράνεια. ο πελάτης θα επανασυνδεθεί.
4. 2 Ανάκτηση ροής
WS: διατήρηση μηνυμάτων όφσετ/ακολουθίας και αίτηση δέλτα μετά την επανασύνδεσή τους.
SSE: χρήση 'id:' για κάθε γεγονός και 'Last-Event-ID' στο αίτημα - ο εξυπηρετητής στέλνει χαμένα γεγονότα.
5) Εξακρίβωση ταυτότητας και εξουσιοδότηση
Η JWT Bearer στην αίτηση URL (WS) είναι επισφαλής (διαρροές σε αρχεία καταγραφής). Χρησιμοποιήστε μια κεφαλίδα (μέσω της κύριας χειραψίας HTTP) ή cookies με τις σημαίες 'Secure', 'HttpOnly', 'SameSite'.
Το mTLS (ειδικά για το B2B) είναι δυνατό, καθώς και η υπογραφή (HMAC) επί του αρχικού αιτήματος.
Για τις SSE με cookies, θυμηθείτε για το CORS ('Access-Control-Ablow-Origin', 'Ablow-Credential ).
Συμβολική περιστροφή: Μην κόβετε το ρεύμα. Περάστε «θα λήξει σύντομα» → ο πελάτης θα ξανανοίξει τη σύνδεση με το νέο σύμβολο.
6) Μορφότυπος δεδομένων και συμπίεση
WebSocket: ενεργοποιήστε προσεκτικά την αποφουσκωμένη διαπερατότητα (CPU). αποφυγή συμπίεσης ήδη συμπιεσμένων μορφοτύπων (Proto, Avro). Το δυαδικό ωφέλιμο φορτίο είναι πιο οικονομικό από το JSON.
ΚΑΟ: αυτό είναι το κείμενο. για μεγάλα δεδομένα, αποστολή συνδέσμου σε αρχεία πόρων REST/gRPC ή κομματιών· μεταφορά gzip για την ΚΑΟ - κατάλληλη, αλλά προσέξτε για ρυθμιστικό διάλυμα σε πληρεξούσιο/CDN.
7) Κλιμάκωση και εξάλειψη ανεμιστήρα
7. 1 Οριζόντια κλιμάκωση
Διατήρηση της εφαρμογής χωρίς ελαττώματα για επανεκκίνηση. Κατάσταση σύνδεσης - στο εμπρόσθιο στρώμα. στοιχεία - από τον μεσίτη.
Το sticky (hash by session/user) είναι απαραίτητο αν υπάρχουν τοπικές ουρές.
Το ιδανικό είναι το μέτωπο χωρίς απάτριδα: ο κόμβος μόνο πολυπλέκτες συνδρομές? τα γεγονότα προέρχονται από μια κοινή παμπ/υποβρύχιο.
7. 2 Pub/Sub and Brokers
Για ένα ευρύ fan-out, χρησιμοποιήστε το Kafka/NATS/Redis Streams.
Το θεματικό επίπεδο «Fanout Gateway» προσυπογράφει τα θέματα και τις ατέλειες πελατών μέσω WS/SSE.
Χρησιμοποιήστε ένα πλήκτρο δρομολόγησης (για παράδειγμα, 'userId', 'matchId') για την εξισορρόπηση του φορτίου μεταξύ κόμβων.
8) Ρυθμίσεις παραγωγής
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 - ΚΑΟ (σημαντικό για την απενεργοποίηση του ρυθμιστικού διαλύματος)
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 (Σημειώσεις εισόδου, είσοδος NGINX)
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 (κόμβος. 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 (περιηγητής)
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).
Ποσόστωση ανά διάρκεια ζωής σύνδεσης και συνολική κυκλοφορία.
Όριο μεγέθους μηνύματος и max μηνύματα/sec.
φίλτρα WAF/bot στο στάδιο της χειραψίας· προστασία από τις πλημμύρες σύνδεσης (πολλές σύντομες συνδέσεις).
Απομόνωση ενοικιαστή/χώρου ονομάτων: μεμονωμένες δεξαμενές πόρων.
11) Παρατηρησιμότητα
Μετρήσεις:- 'connections _ active', 'connections _ new _ total', 'bytes _ in/out',
- 'messages _ in/out _ total', 'droped _ messages _ total',
- 'reconnects _ total', 'latency _ delivery _ ms {p50, p95, p99}'.
- Αρχεία καταγραφής: IP/UA, userId/tenantId, λόγος κλεισίματος ('close _ code'), διάρκεια.
- Εντοπισμός: συσχετισμός συμβάντων με την αρχική εντολή (ταυτότητες συσχέτισης). για WS, χρησιμοποιήστε «εικονική» κλίμακα butch.
12) Λειτουργικές αποχρώσεις
Τερματισμός TLS πιο κοντά στον πελάτη (CDN/άκρο).
Προληπτική περιστροφή των συνδέσεων (χαριτωμένη) κατά τη διάρκεια αποσύνδεσης: δώστε τη σημαία «επανασύνδεση».
Αφαίρεση του πλήκτρου για την ομοιόμορφη κατανομή των «θερμών» καναλιών.
Στιγμιότυπα κατάστασης για καθυστερημένους συνδρομητές (στιγμιότυπο + δέλτα).
Κρύπτη τελευταίας αξίας (ειδικά ΚΑΟ) - χρήσιμο για ψυχρό πελάτη.
13) Αντι-μοτίβα
Stream μεγάλα δυαδικά κομμάτια μέσω SSE ή JSON μέσω WS - χρησιμοποιήστε HTTP λήψη και σύνδεση στο μήνυμα.
Έγκριση μόνο κατά τη στιγμή της σύνδεσης και απουσία επανελέγχου για μεγάλες συνόδους.
Παγκόσμια κολλώδη άσκοπα → ανισορροπία και καυτοί κόμβοι.
Timeouts/όρια → παγωμένες συνδέσεις με αναπηρία τρώνε μέχρι την πισίνα.
Ο διαμεσολαβητής SSE/ρυθμιστικός μηχανισμός CDN → «πραγματικός χρόνος» γίνεται λεπτά καθυστέρησης.
Έλλειψη ακολουθίας/όφσετ → μετά την επανασύνδεση, ο πελάτης χάνει την ακεραιότητα των δεδομένων.
14) Κατάλογος ελέγχου εφαρμογής
- Επιλέγεται WS (αμφίδρομη) ή SSE (μονόπλευρη).
- Ρυθμισμένα χρονοδιαγράμματα, τροφοδοτικό και επανασύνδεση (backoff + jitter).
- Σχεδιασμένη ακολουθία/όφσετ και (για SSE) 'id '/' Last-Event-ID'.
- Μέγεθος/ταχύτητα/συνδέσεις/ποσοστώσεις, καθορισμένη προστασία DOS.
- Ρυθμίσεις διαμεσολάβησης/εισόδου: αναβάθμιση, proxy_buffering εκτός λειτουργίας (SSE), ανάγνωση/αποστολή χρονοδιαγραμμάτων.
- Κλιμάκωση: παμπ/υπο-μεσίτης, πύλη ανεμιστήρα-out, αυτοκόλλητη μόνο εάν χρειάζεται.
- Επαλήθευση ταυτότητας: ασφαλής μεταφορά σημάτων, περιστροφή χωρίς διακοπή.
- Παρατηρησιμότητα: μετρήσεις, κούτσουρα, ίχνη. ταμπλό και ειδοποιήσεις.
- Σχέδιο απελευθέρωσης: χαριτωμένες συνδέσεις αποστράγγισης, σηματοδοτήστε τον πελάτη να επανασυνδεθεί.
- Ημέρες παιχνιδιού: διαλείμματα δικτύου, σταγόνες κόμβου, υπερφόρτωση μεσίτη, μακρά RTT.
15) ΣΥΧΝΈΣ ΕΡΩΤΉΣΕΙΣ
Μπορεί η SSE να αποθηκευτεί μέσω CDN
Συνήθως όχι: είναι μια εξατομικευμένη ροή. Για τα δημόσια κανάλια - πιθανώς με σύντομο TTL και κομματιασμένη παράδοση, αλλά είναι εύκολο να σπάσει «πραγματικό χρόνο».
Το WebSocket λειτουργεί πάνω από HTTP/2/3
Ο περιηγητής WS ξεκινά με HTTP/1. αναβάθμιση 1· υπάρχει RFC 8441 για h2, απαιτείται υποστήριξη στον διαμεσολαβητή/εξυπηρετητή χωριστά. Με h3 - σε κίνηση. για το streaming, h3 έχει WebTransport, αλλά είναι ένα διαφορετικό API.
gRPC έναντι WS για τον περιηγητή
Ένας καθαρός περιηγητής δεν λέει gRPC. χρειάζονται gRPC-Web μέσω του απεσταλμένου. Για διαδραστικές UI, το WS + REST είναι συχνά ευκολότερο.
16) Σύνολα
WebSocket - όταν χρειάζεστε διάλογο σε πραγματικό χρόνο και ένα συμπαγές δίπλευρο κανάλι.
SSE - όταν χρειάζεστε μια απλή και αξιόπιστη ώθηση από τον εξυπηρετητή στον πελάτη, ελάχιστη πολυπλοκότητα και αυτόματη επανασύνδεση.
Η επιτυχία στις πωλήσεις είναι τα σωστά χρονοδιαγράμματα και όρια, ανάκτηση από όφσετ, παμπ/υπο-ανεμιστήρα-out, σωστές ρυθμίσεις διαμεσολαβητή και σαφή παρατηρησιμότητα.