Ροές και εκδηλώσεις WebSocket
TL, DR
Ροή εργασίας = έμπιστο κανάλι (WSS) + συνοπτικές αντισταθμίσεις + idempotent events + αυστηρά όρια και backpressure. Do: εξακρίβωση ταυτότητας JWT, εξουσιοδότηση για θέματα, καρδιακούς παλμούς, seq/offset + recume-token, τουλάχιστον μία φορά + deadup. Για κλίμακα - συντριβή χρήστη/ενοικιαστή, κολλώδης δρομολόγηση και ουρά (Kafka/NATS/Redis Streams) ως πηγή αλήθειας.
1) Επιχειρηματικές υποθέσεις iGaming (αυτό που πραγματικά μεταδίδουμε)
Ζυγός/όρια: στιγμιαίες μεταβολές του ζυγού, όρια RG, κλειδαριές.
Στοιχήματα/γύροι/αποτελέσματα: επιβεβαίωση, κατάσταση, υπολογισμός των κερδών.
Τουρνουά/leaderboards: θέσεις, χρονοδιακόπτες, βραβεία.
Πληρωμές: καθεστώς πληρωμής/επιστροφής χρημάτων, σημαίες KYC/AML - όπως κοινοποιήσεις (και η κριτική παραμένει στα βιβλία REST + webhooks).
Εκδηλώσεις εξυπηρέτησης: μηνύματα συνομιλίας, μηνύματα ώθησης, καταστάσεις συνεδρίας, συντήρηση.
2) Πρωτόκολλο και σύνδεση
Μόνο WSS (TLS 1. 2+/1. 3). Μέγιστη ενεργός σύνδεση 1 ανά προεπιλεγμένη διάταξη/συνεδρία.
Ping/Pong: ο πελάτης στέλνει 'ping' every 20-30 δευτερόλεπτα, ο χρόνος απόκρισης είναι 10 δευτερόλεπτα. Ο εξυπηρετητής ρίχνει τη σύνδεση σε 3 συνεχόμενα χρονικά περιθώρια.
Συμπίεση: 'αποφουσκωτή διαπερατότητας', όριο μεγέθους πλαισίου (π.χ. ≤ 64 KB).
Μορφή ωφέλιμου φορτίου: JSON για εξωτερικό, Protobuf/MsgPack για εσωτερικό/κινητό.
3) Εξακρίβωση της γνησιότητας και αδειοδότηση
Χειραψία JWT σε ερώτηση/κεφαλίδα ('Sec-WebSocket-Protocol '/' Εξουσιοδότηση'), TTL συμβολική σύντομη (≤ 15 λεπτά), ανανέωση από εκτός ζώνης (REST).
Ισχυρισμοί με επίκεντρο τους ενοικιαστές: «υπο», «ενοικιαστής», «πεδία», «κίνδυνος _ σημαίες».
ACL σε θέματα/κανάλια: εγγραφή μόνο σε επιτρεπόμενα 'θέματα' (για παράδειγμα: 'χρήστης: {id}', 'τουρνουά: {id}', 'παιχνίδι: {table}').
Επαναδιατύπωση σύνδεσης όταν η μάρκα λήξει: «μαλακό παράθυρο» 60 s.
4) Υπόδειγμα συνδρομής
Ο πελάτης στέλνει εντολές μετά τη σύνδεση:json
{ "op":"subscribe", "topics":["user:123", "tournament:456"], "resume_from":"1748852201:987654" }
{ "op":"unsubscribe", "topics":["tournament:456"] }
'επανάληψη _ από' - όφσετ (βλέπε § 5) εάν ο πελάτης επανασυνδεθεί.
Ο διακομιστής απαντά με ack/nack, τα αποτυχημένα ACL είναι στο 'nack' με 'reason'.
5) Εγγυήσεις παράδοσης και περιληπτικό σημείωμα
Σκοπός: τουλάχιστον μία φορά ανά κανάλι + ταυτότητα στον πελάτη.
Κάθε εκδήλωση έχει ένα μονότονο 'seq' within το «μέρος» (συνήθως χρήστης/δωμάτιο) και ένα παγκόσμιο 'event _ i for deduplication.
Με μια επανασύνδεση, ο πελάτης στέλνει 'recume _ από' = το τελευταίο επιβεβαιωμένο 'seq' (ή 'offset' του μεσίτη). Ο εξυπηρετητής φορτώνει αστοχημένα γεγονότα από την «πηγή της αλήθειας» (Kafka/NATS/Redis Streams).
Αν η καθυστέρηση υπερβαίνει την κατακράτηση (για παράδειγμα, 24 ώρες), ο εξυπηρετητής στέλνει ένα «στιγμιότυπο» της κατάστασης και ένα νέο «seq».
- Αποθήκευση 'last _ seq '/' event _ i in σταθερή αποθήκευση (IndexedDB/Keychain).
- Dedup by 'event _ id', παραλείψτε γεγονότα με 'seq ≤ last_seq', ανιχνεύστε τρύπες (κενό) → αυτόματο' resync 'αίτημα στιγμιότυπου.
6) Σύστημα μηνυμάτων (φάκελο)
json
{
"ts": "2025-11-03T12:34:56. 789Z",
"topic": "user:123",
"seq": "1748852201:987654", // partition:offset
"event_id": "01HF..", // UUID/KSUID
"type": "balance. updated",
"data": { "currency":"EUR", "delta"--5. 00, "balance":125. 37 },
"trace_id": "4e3f.., "//for correlation
"signature": "base64 (hmac (...)) "//optional for partners
}
'type' - ταξινομική περιοχή (βλέπε λεξικό γεγονότων).
PII/PCI - εξαίρεση/μάσκα σε επίπεδο πύλης.
7) Αντίθλιψη, ποσοστώσεις και προστασία έναντι «ακριβών» πελατών
Εξυπηρετητής → Πελάτης: αναμονή αποστολής ανά σύνδεση με συρόμενο παράθυρο. Πλήρης - επαναρύθμιση συνδρομών σε «θορυβώδη» θέματα ή αποσύνδεση με τον κωδικό '1013 '/' πολιτική _ παραβίαση'.
Client → Server: όρια στο 'subscribe/unsubscribe' (για παράδειγμα, ≤ 10/sec), όριο καταλόγου θεμάτων (≤ 50), ελάχιστο διάστημα επαναπροσδιορισμού.
Όρια επιτοκίου ανά IP/ενοικιαστή/κλειδί. Οι ανωμαλίες → προσωρινό αποκλεισμό.
Προτεραιότητα: ζωτικά γεγονότα (ισορροπία, όρια RG) - σειρά αναμονής προτεραιότητας.
8) Προστασία και ασφάλεια
Προφίλ WAF/bot στο τελικό σημείο χειραψίας, Κατάλογος επιτρεπόμενης προέλευσης.
mTLS μεταξύ πύλης ακμής και κόμβων ροής.
Προστασία DOS: cookies SYN στο L4, όρια στον αριθμό του ανοικτού WS/διαρκούς διαστήματος.
Αντιεπανάληψη: «χρονοσφραγίδα» σε προαιρετική υπογραφή ωφέλιμου φορτίου (για συνεργάτες) με έγκυρο παράθυρο 5 λεπτών.
Απομόνωση ενοικιαστή: φυσική/λογική συγκράτηση, κλειδιά/μάρκες ανά ενοικιαστή.
9) Αρχιτεκτονική μεταφορών
Πύλη (άκρη): τερματικός σταθμός TLS, authN/Z, ποσοστώσεις, δρομολόγηση ανά μέρος.
Κόμβοι ροής: ανιθαγενείς εργαζόμενοι με κολλώδη δρομολόγηση με «hash (user_id)% N».
Μεσίτης εκδηλώσεων: Kafka/NATS/Redis Streams - πηγή αλήθειας και ρυθμιστικού διαλύματος αναπαραγωγής.
Κρατική υπηρεσία: στιγμιότυπα καταστημάτων (ισορροπία, θέσεις στο τουρνουά).
Πολυπεριφέρεια: περιουσιακό στοιχείο· GSLB κατά πλησιέστερη περιφέρεια· η περιφέρεια του τόπου εγκατάστασης ορίζεται σε login· με ένα φτερό - μια «ψυχρή» περίληψη από μια άλλη περιοχή.
10) Τάξη, συνέπεια, ιδιαιτερότητα
Η παραγγελία είναι εγγυημένη μέσα στο κόμμα (χρήστης/δωμάτιο), όχι παγκοσμίως.
Συνέπεια: η εκδήλωση μπορεί να προηγηθεί της αντίδρασης REST. Η UX πρέπει να είναι σε θέση να ζει με ένα ενδιάμεσο κράτος (αισιόδοξη συμφιλίωση UI +).
Ταυτότητα: η επανεπεξεργασία 'event _ id' δεν αλλάζει την κατάσταση του πελάτη.
11) Σφάλματα, επανασύνδεση και καταιγίδες
Κωδικοί κλεισίματος: '1000' (κανονικό), '1008' (πολιτικό), '1011' (εσωτερικό), '1013' (υπερφόρτωση εξυπηρετητή).
Πελάτης εκθετική εφεδρεία + νευρικότητα: 1s, 2s, 4s... το πολύ 30s.
Κατά τη διάρκεια επανασύνδεσης μάζας («κεραυνός κοπαδιού») - ο διακομιστής δίνει 'retry _ after' and 'gray' απαντήσεις με την άμεση χρήση SSE reflback για μόνο ανάγνωση.
12) Μετρητά και στιγμιότυπα
Κάθε συνδρομή μπορεί να ξεκινήσει με ένα στιγμιότυπο της τρέχουσας κατάστασης, και στη συνέχεια μια ροή των γεγονότων diff.
Έκδοση και συμβατότητα σχήματος Data _ version (η επέκταση πεδίου δεν σπάει τους πελάτες).
13) Παρατηρησιμότητα και SLO
Μετρήσεις:- Συνδέσεις: ενεργό, καθιερωμένο/δευτερόλεπτο, διανομή ανά ενοικιαστή/περιφέρεια.
- Παράδοση: p50/p95 καθυστερήσεις από μεσίτη σε πελάτη, επιτόκιο πτώσης, επιτόκιο επαναπώλησης.
- Αξιοπιστία: μερίδιο των επιτυχημένων επαναλήψεων χωρίς στιγμιότυπο, ανιχνευτή κενού.
- Σφάλματα: 4xx/5xx για χειραψία, κωδικούς κλεισίματος, οριακές επιτυχίες.
- Φόρτωση: RPS εντολών 'εγγραφής', μεγέθους αναμονής, CPU/NET.
- Δημιουργία της WS p95 ≤ 500 ms (εντός της περιοχής).
- Latency event p95 ≤ 300 ms (κατάτμηση χρήστη).
- Επανάληψη επιτυχίας ≥ 99%, απώλεια μηνυμάτων = 0 (по τουλάχιστον μία φορά).
- Τελικό σημείο ανάντη ροής ≥ 99. 95%.
14) Διαχείριση σχήματος και έκδοσης
Λεξικό γεγονότων με ιδιοκτήτες, παραδείγματα και σημασιολογία.
«Ήπια» εξέλιξη: μόνο η προσθήκη προαιρετικών πεδίων. διαγραφή - μετά την περίοδο «@ deprected».
Δοκιμές συμβάσεων έναντι πελατών SDK, linters για JSON Schema/Protobuf.
15) Βιβλία παιχνιδιών περιστατικών (ενσωματωμένα στο κοινό σας βιβλίο παιχνιδιών)
Αύξηση της καθυστέρησης: μετάβαση των μερών σε εφεδρικούς κόμβους, αύξηση του μεγέθους της παρτίδας στον μεσίτη, δυνατότητα ιεράρχησης των ζωτικών γεγονότων.
Επανασύνδεση καταιγίδας: ενεργοποίηση 'retry _ after', προσωρινή αύξηση ορίων χειραψίας, ενεργοποίηση οπισθοδρόμησης SSE.
Διαρροή σημάτων: περιστροφή JWKS, ανάκληση επηρεασμένων σημάτων, αναγκαστική επανασύνδεση με επανασύνδεση.
Απώλεια μεσίτη: μεταφορά σε λειτουργία στιγμιότυπου, επανάληψη μετά την ανάκτηση.
16) API Mini Προδιαγραφή (Απλουστευμένη)
Χειραψία (HTTP GET → WS):
GET /ws? tenant=acme&client=web
Headers:
Authorization: Bearer <JWT>
X-Trace-Id: <uuid>
Εντολές πελάτη:
json
{ "op":"subscribe", "topics":["user:123"], "resume_from":"1748852201:42" }
{ "op":"unsubscribe", "topics":["user:123"] }
{ "op":"ping", "ts":"2025-11-03T12:34:56Z" }
Απαντήσεις εξυπηρετητή:
json
{ "op":"ack", "id":"subscribe:user:123" }
{ "op":"event", "topic":"user:123", "seq":"1748852201:43", "type":"balance. updated", "data":{...} }
{ "op":"snapshot", "topic":"user:123", "seq":"1748852201:42", "state":{...} }
{ "op":"error", "code":"acl_denied", "reason":"no access to topic tournament:456" }
{ "op":"pong", "ts":"..." }
17) Κατάλογος ελέγχου UAT
- Περίληψη από την αντιστάθμιση μετά από 1/10/60 λεπτά διακοπής του χρόνου του πελάτη.
- Dedup: η ανακατανομή του ίδιου «event _ id» δεν αλλάζει κατάσταση.
- Ανιχνευτής κενού → αυτόματο «στιγμιότυπο» και ευθυγράμμιση.
- Ποσοστώσεις και αντίθλιψη: ο φορτωμένος πελάτης λαμβάνει πολιτική αποσύνδεση.
- Πολυπεριφέρεια: αδυναμία της περιφέρειας, με ταυτόχρονη διατήρηση της αντιστάθμισης.
- Ασφάλεια: Η Token rocker έληξε από την JWT, προσπαθώντας να εγγραφεί εκτός ACL.
- Το υπόλοιπο RG/event έρχεται πριν/μετά το REST - UI σωστά «ράμματα».
18) Συχνά σφάλματα
Όχι «seq/offset» και ανανέωση - απώλεια γεγονότων και εμπιστοσύνης.
Ανάμειξη κρίσιμων εντολών πληρωμής σε μεταλλάξεις WS - χρήση REST.
Έλλειψη αντίθλιψης/ποσοστώσεων - «αναρτημένες» συνδέσεις και χιονοστιβάδα μνήμης.
Η παγκόσμια τάξη είναι δαπανηρή και περιττή. επαρκής τάξη στον διάδικο.
Καταγραφή PII σε γεγονότα - παραβιάσεις της ιδιωτικής ζωής και ΕΚΕ/GDPR.
Έλλειψη λεξικού γεγονότων και εκδόσεων - οι πελάτες καταρρέουν.
Περίληψη
Τα ρεύματα WebSocket δίνουν αντιδραστικά UX και λειτουργικά σήματα αν είναι κατασκευασμένα ως συνοπτικό, προστατευμένο και περιορισμένο κανάλι: WSS + mTLS/JWT, ACL σε θέματα, seq/offset + επανάληψη, τουλάχιστον μία φορά με αφαίρεση, backpressure/ποσοστώσεις, μεσίτης ως πηγή αλήθεια, παρατηρησιμότητα και SLO. Έτσι, τα ρεύματα παραμένουν γρήγορα για τον χρήστη και είναι διαχειρίσιμα για την πλατφόρμα - χωρίς συμβιβασμούς για την ασφάλεια και το χρήμα.