Logo GH

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, σωστές ρυθμίσεις διαμεσολαβητή και σαφή παρατηρησιμότητα.

Contact

Επικοινωνήστε μαζί μας

Επικοινωνήστε για οποιαδήποτε βοήθεια ή πληροφορία.Είμαστε πάντα στη διάθεσή σας.

Telegram
@Gamble_GC
Έναρξη ολοκλήρωσης

Το Email είναι υποχρεωτικό. Telegram ή WhatsApp — προαιρετικά.

Το όνομά σας προαιρετικό
Email προαιρετικό
Θέμα προαιρετικό
Μήνυμα προαιρετικό
Telegram προαιρετικό
@
Αν εισαγάγετε Telegram — θα απαντήσουμε και εκεί.
WhatsApp προαιρετικό
Μορφή: κωδικός χώρας + αριθμός (π.χ. +30XXXXXXXXX).

Πατώντας «Αποστολή» συμφωνείτε με την επεξεργασία δεδομένων.