Το Laravel μπορεί να τροφοδοτεί dashboards πραγματικού χρόνου πάνω σε ροές μεγάλου όγκου, αρκεί τα ακατέργαστα γεγονότα να μη φτάνουν ποτέ στον browser: βάλτε την είσοδο σε buffer στο Redis, επεξεργαστείτε τη σε workers μέσω ουρών, συγκεντρώστε τα δεδομένα από πριν σε χρονικά διαστήματα και μεταδώστε μέσω WebSockets μόνο συνόψεις. Ειδοποιήστε με βάση δυναμικά κατώφλια που προκύπτουν από το πρόσφατο ιστορικό αντί για σταθερά όρια, και προσθέστε μια αποκλειστική πλατφόρμα streaming όταν οι ανάγκες για επανάληψη, σειρά ή όγκο ξεπερνούν τις ουρές του Redis.
Κρατήστε τα ακατέργαστα γεγονότα μακριά από τον browser
Το πιο συνηθισμένο λάθος στα dashboards πραγματικού χρόνου είναι να στέλνεται κάθε εισερχόμενο γεγονός σε κάθε συνδεδεμένη οθόνη. Σε μεγάλο όγκο, οι browsers μένουν πίσω, ο διακομιστής WebSocket φτάνει σε κορεσμό, και το γράφημα γίνεται έτσι κι αλλιώς δυσανάγνωστο.
Χωρίστε το σύστημα σε τέσσερα στάδια: είσοδος, επεξεργασία, συγκέντρωση και μετάδοση. Κάθε στάδιο έχει τη δική του δυναμικότητα και μπορεί να επιβραδυνθεί χωρίς να παρασύρει τα άλλα. Το dashboard λαμβάνει συγκεντρωτικές ενημερώσεις σε σταθερό ρυθμό, για παράδειγμα μία φορά το δευτερόλεπτο ανά πάνελ, όχι ακατέργαστα γεγονότα.
Οι μηχανικοί μας χρησιμοποίησαν αυτή τη δομή στη Slump, μια πλατφόρμα παρακολούθησης σε πραγματικό χρόνο των τάσεων του δικτύου 5G, των δεικτών χωρητικότητας και της πρόβλεψης κορεσμού για παρόχους σε όλη τη νότια Ισπανία, χτισμένη σε backend Laravel 11 και 12 που δέχεται δεδομένα streaming μεγάλου όγκου.
Βάλτε την είσοδο σε buffer, ώστε οι αιχμές κίνησης να μη γίνονται διακοπές
Το endpoint εισόδου πρέπει να κάνει όσο το δυνατόν λιγότερα: να επικυρώνει το payload, να το προσθέτει σε ένα buffer και να επιστρέφει. Η ανάλυση, ο εμπλουτισμός και οι εγγραφές στη βάση δεδομένων ανήκουν στους workers.
Σε μέτριο όγκο, το Redis λειτουργεί καλά ως τέτοιο buffer. Προσθέστε τα γεγονότα σε μια λίστα ή σε ένα stream του Redis και αφήστε τους workers να τα τραβούν σε παρτίδες, γιατί μία ομαδική εισαγωγή κοστίζει στη βάση δεδομένων πολύ λιγότερο από εκατοντάδες εισαγωγές μίας γραμμής.
- Επικυρώστε το σχήμα και απορρίψτε τα κακοσχηματισμένα γεγονότα στην είσοδο
- Επιστρέψτε γρήγορα και μη γράφετε ποτέ στην κύρια βάση δεδομένων μέσα στο αίτημα
- Διαβάζετε από το buffer σε παρτίδες και όχι ένα γεγονός ανά job
- Βάλτε όριο στο μήκος του buffer και ειδοποίηση όταν μεγαλώνει, ώστε η συσσώρευση να φαίνεται πριν γίνει απώλεια δεδομένων
Κλιμακώστε την επεξεργασία με ξεχωριστές ουρές και το Horizon
Οι ουρές του Laravel με Redis σάς δίνουν workers που μπορείτε να προσθέτετε οριζόντια. Το Laravel Horizon προσθέτει αριθμό workers ανά ουρά, ρυθμό επεξεργασίας και χρόνους αναμονής, κι έτσι ελέγχετε ότι η επεξεργασία προλαβαίνει την είσοδο.
Χωρίστε τις ουρές ανά προτεραιότητα. Η αξιολόγηση των ειδοποιήσεων δεν πρέπει ποτέ να περιμένει πίσω από μια συσσώρευση επανεπεξεργασίας ιστορικών δεδομένων, οπότε δώστε στην επεξεργασία, τη συγκέντρωση, τις ειδοποιήσεις και τις εξαγωγές δικές τους ουρές και ομάδες workers.
Κάντε κάθε job idempotent. Τα streams ξαναστέλνουν, οι workers καταρρέουν στη μέση μιας παρτίδας και οι επαναλήψεις συμβαίνουν, οπότε η διπλή επεξεργασία του ίδιου γεγονότος δεν πρέπει να διπλασιάζει έναν μετρητή. Ένα αναγνωριστικό γεγονότος που ελέγχεται σε ένα βραχύβιο σύνολο του Redis συχνά αρκεί.
Συγκεντρώστε τα δεδομένα σε χρονικά διαστήματα πριν τα μεταδώσετε
Τα dashboards δείχνουν ρυθμούς, μέσους όρους, εκατοστημόρια και τάσεις, όχι μεμονωμένα γεγονότα. Υπολογίστε τα στους workers σε σταθερά χρονικά διαστήματα, για παράδειγμα ανά δευτερόλεπτο και ανά λεπτό, για κάθε οντότητα που εμφανίζετε: μια κυψέλη, μια περιοχή, έναν πελάτη.
Κρατήστε τα ζωντανά συγκεντρωτικά στοιχεία στο Redis, με hashes ή sorted sets με κλειδί το διάστημα, και γράψτε κάθε ολοκληρωμένο διάστημα στη βάση δεδομένων για το ιστορικό. Ο σχεδιασμός των queries σε αυτούς τους πίνακες ιστορικού μετρά όσο και η ζωντανή διαδρομή, γιατί οι χρήστες θα κάνουν σμίκρυνση σε μια μέρα ή μια εβδομάδα.
Στη Slump, ο επανασχεδιασμός της cache στο Redis και η βελτιστοποίηση των queries μείωσαν την καθυστέρηση εισόδου, κι αυτό κράτησε τη ζωντανή προβολή ενημερωμένη υπό φορτίο.
Μεταδώστε συνόψεις μέσω WebSockets με το Reverb ή μια φιλοξενούμενη υπηρεσία
Το broadcasting του Laravel στέλνει γεγονότα σε κανάλια στα οποία εγγράφεται το frontend μέσω του Laravel Echo. Το Laravel Reverb είναι ο επίσημος διακομιστής WebSocket του Laravel, και φιλοξενούμενες υπηρεσίες όπως το Pusher ή το Ably λειτουργούν μέσω του ίδιου API broadcasting.
- Μεταδίδετε με χρονοδιακόπτη από τη συγκεντρωτική κατάσταση, όχι μία φορά για κάθε εισερχόμενο γεγονός
- Χρησιμοποιήστε ιδιωτικά κανάλια και εξουσιοδοτήστε κάθε εγγραφή στον διακομιστή, ώστε οι χρήστες να βλέπουν μόνο τις οντότητες που δικαιούνται
- Στέλνετε συμπαγή στιγμιότυπα ή διαφορές, όχι πλήρη σύνολα δεδομένων
- Κατά την επανασύνδεση, ο client φορτώνει την τρέχουσα κατάσταση μέσω HTTP και μετά συνεχίζει τη ροή
- Τρέξτε πολλά instances του Reverb πίσω από έναν load balancer, με Redis pub/sub ανάμεσά τους, καθώς αυξάνονται οι συνδέσεις
Ειδοποιήστε με δυναμικά κατώφλια αντί για σταθερά όρια
Τα σταθερά κατώφλια αποτυγχάνουν και προς τις δύο κατευθύνσεις στις μετρικές streaming. Η κίνηση στις 3 τα ξημερώματα δεν μοιάζει καθόλου με την κίνηση στις 8 το βράδυ, οπότε ένα ενιαίο όριο είτε χτυπά όλη τη νύχτα είτε χάνει τα προβλήματα της ημέρας.
Ένα δυναμικό κατώφλι συγκρίνει κάθε νέα τιμή με μια βάση αναφοράς που προκύπτει από το πρόσφατο ιστορικό της ίδιας οντότητας για την ίδια ώρα της εβδομάδας. Μια απλή, εξηγήσιμη εκδοχή κρατά κυλιόμενο μέσο όρο και τυπική απόκλιση ανά οντότητα και ώρα της εβδομάδας, και σημαίνει ειδοποίηση όταν η τιμή μένει εκτός αυτής της ζώνης για αρκετά διαδοχικά διαστήματα.
Στη Slump, οι δυναμικές ειδοποιήσεις ανωμαλιών μείωσαν τη χειροκίνητη παρακολούθηση, γιατί οι χειριστές ειδοποιούνταν για πραγματικές αποκλίσεις αντί να παρακολουθούν οθόνες.
- Απαιτήστε διάρκεια, για παράδειγμα τρία διαδοχικά διαστήματα εκτός ζώνης, για να κόψετε τον θόρυβο
- Κρατήστε μία ανοιχτή ειδοποίηση ανά οντότητα και συνθήκη, που ενημερώνεται αντί να επαναλαμβάνεται
- Περιλάβετε σε κάθε ειδοποίηση την τρέχουσα τιμή, τη βάση αναφοράς, τη ζώνη και έναν σύνδεσμο προς το πάνελ
- Εξετάζετε τακτικά τις ειδοποιήσεις που σιγήθηκαν ή αγνοήθηκαν και ρυθμίζετε τη ζώνη
Να ξέρετε πότε να προσθέσετε αποκλειστική τεχνολογία streaming
Το Laravel με το Redis καλύπτει πολλά, αλλά έχει όρια. Εξετάστε το Kafka, το Redpanda ή μια διαχειριζόμενη υπηρεσία streaming, συχνά με έναν επεξεργαστή ροών όπως το Apache Flink, όταν χρειάζεστε μακρά διατήρηση και επανάληψη των ακατέργαστων γεγονότων, αυστηρή σειρά ανά κλειδί σε πολλούς καταναλωτές ή ρυθμό που κάνει τη μνήμη του Redis σημείο συμφόρησης.
Η αλλαγή δεν χρειάζεται να γίνει μονομιάς. Κρατήστε το Laravel για το API, τα dashboards, τη διαχείριση των ειδοποιήσεων και το broadcasting, και βάλτε τη ροή μπροστά από το στάδιο της συγκέντρωσης. Κατασκευάζουμε και επεκτείνουμε συστήματα πραγματικού χρόνου αυτής της μορφής, από την είσοδο μέχρι τους κανόνες ειδοποιήσεων στους οποίους βασίζονται οι χειριστές.
Τα βασικά σημεία
- Μη στέλνετε ποτέ ακατέργαστα γεγονότα στους browsers· μεταδίδετε συγκεντρωτικές συνόψεις σε σταθερό ρυθμό.
- Κρατήστε το endpoint εισόδου λιτό και βάζετε τα γεγονότα σε buffer στο Redis για ομαδική επεξεργασία από workers.
- Χωρίστε τις ουρές ανά προτεραιότητα και κάντε κάθε job idempotent, ώστε οι επαναλήψεις να μην αλλοιώνουν τους μετρητές.
- Τα δυναμικά κατώφλια με βάση το πρόσφατο ιστορικό δίνουν λιγότερες και πιο χρήσιμες ειδοποιήσεις από τα σταθερά όρια.
- Προσθέστε Kafka ή παρόμοια πλατφόρμα όταν χρειάζεστε επανάληψη, αυστηρή σειρά ή όγκο πέρα από το Redis, και κρατήστε το Laravel για το επίπεδο εφαρμογής.
Συχνές ερωτήσεις
Μπορεί το Laravel να υποστηρίξει dashboards πραγματικού χρόνου για δεδομένα μεγάλου όγκου;
Ναι, όταν η αρχιτεκτονική κρατά τη βαριά δουλειά έξω από τη διαδρομή του αιτήματος: ένα λιτό endpoint εισόδου, ένα buffer στο Redis, workers σε ουρές που συγκεντρώνουν σε χρονικά διαστήματα, και μετάδοση μόνο συνόψεων μέσω WebSockets. Το Laravel εξυπηρετεί τότε το API, τα dashboards και τις ειδοποιήσεις, ενώ οι workers κλιμακώνονται ανεξάρτητα.
Laravel Reverb ή Pusher για WebSockets;
Το Reverb είναι ο επίσημος διακομιστής WebSocket του Laravel και τρέχει στη δική σας υποδομή, κάτι που ταιριάζει σε ομάδες που θέλουν έλεγχο στο κόστος και στη θέση των δεδομένων. Το Pusher ή το Ably αφαιρούν τη λειτουργική δουλειά των διακομιστών WebSocket. Και τα δύο χρησιμοποιούν το ίδιο API broadcasting του Laravel, οπότε μπορείτε να αλλάξετε αργότερα.
Τι είναι ένα δυναμικό κατώφλι στην παρακολούθηση;
Ένα δυναμικό κατώφλι είναι ένα όριο ειδοποίησης που υπολογίζεται από το πρόσφατο ιστορικό της ίδιας μετρικής, οντότητας και ώρας της εβδομάδας, αντί για έναν σταθερό αριθμό. Προσαρμόζεται στα ημερήσια και εβδομαδιαία μοτίβα, ώστε οι ειδοποιήσεις να ενεργοποιούνται σε πραγματικές αποκλίσεις και όχι σε κανονικές αιχμές.