Προγραμματισμός

Πώς να χρησιμοποιήσετε ομάδες καταναλωτών στο Redis Streams

Ο Roshan Kumar είναι ανώτερος διευθυντής προϊόντων στο Redis Labs.

Το Redis Streams είναι μια νέα δομή δεδομένων, που εισήχθη στο Redis 5.0, που σας επιτρέπει να δημιουργείτε και να διαχειρίζεστε ροές δεδομένων. Σε ένα προηγούμενο άρθρο, έδειξα πώς να προσθέσω δεδομένα σε μια ροή και πώς να διαβάζω τα δεδομένα με πολλούς τρόπους. Σε αυτό το άρθρο, θα εξηγήσω πώς να χρησιμοποιώ ομάδες καταναλωτών στο Redis Streams. Μια ομάδα καταναλωτών είναι ένας τρόπος να διαιρέσετε μια ροή μηνυμάτων μεταξύ πολλαπλών πελατών για να επιταχύνετε την επεξεργασία ή να μειώσετε το φορτίο για πιο αργούς καταναλωτές.

Σε έναν τέλειο κόσμο, τόσο οι παραγωγοί δεδομένων όσο και οι καταναλωτές εργάζονται με τον ίδιο ρυθμό και δεν υπάρχει απώλεια δεδομένων ή καθυστέρηση δεδομένων. Δυστυχώς, αυτό δεν συμβαίνει στον πραγματικό κόσμο. Σε όλες σχεδόν τις περιπτώσεις χρήσης ροής δεδομένων σε πραγματικό χρόνο, οι παραγωγοί και οι καταναλωτές εργάζονται με διαφορετικές ταχύτητες. Επιπλέον, υπάρχουν περισσότεροι από ένας τύποι καταναλωτών, ο καθένας με τις δικές του απαιτήσεις και ρυθμό επεξεργασίας. Η Redis Streams αντιμετωπίζει αυτήν την ανάγκη με ένα σύνολο χαρακτηριστικών που βαρύνει σημαντικά την υποστήριξη των καταναλωτών. Ένα από τα πιο σημαντικά χαρακτηριστικά του είναι η ομάδα καταναλωτών.

Πότε να χρησιμοποιήσετε μια ομάδα καταναλωτών Redis Streams

Ο σκοπός των ομάδων καταναλωτών είναι να κλιμακώσει τη διαδικασία κατανάλωσης δεδομένων σας. Ας δούμε ένα παράδειγμα - μια εφαρμογή επεξεργασίας εικόνων. Η λύση απαιτεί τρία κύρια συστατικά:

  1. Ένας παραγωγός (μία ή περισσότερες κάμερες, ίσως) που καταγράφει και αποθηκεύει εικόνες.
  2. Redis Stream που αποθηκεύει εικόνες (σε μια αποθήκευση δεδομένων ροής) με τη σειρά που φθάνουν. και
  3. Ένας επεξεργαστής εικόνας που επεξεργάζεται κάθε εικόνα.
Εργαστήρια Redis

Ας υποθέσουμε ότι ο παραγωγός σας αποθηκεύει 500 εικόνες ανά δευτερόλεπτο και ο επεξεργαστής εικόνας επεξεργάζεται μόνο 100 εικόνες ανά δευτερόλεπτο στην πλήρη χωρητικότητά του. Αυτή η διαφορά ρυθμού θα δημιουργήσει καθυστέρηση και ο επεξεργαστής εικόνων σας δεν θα είναι ποτέ σε θέση να καλύψει τη διαφορά. Ένας εύκολος τρόπος αντιμετώπισης αυτού του προβλήματος είναι να εκτελέσετε πέντε επεξεργαστές εικόνων (όπως φαίνεται στο Σχήμα 2), καθένας από τους οποίους επεξεργάζεται ένα αμοιβαία αποκλειστικό σύνολο εικόνων. Μπορείτε να το επιτύχετε μέσω μιας ομάδας καταναλωτών, η οποία σας επιτρέπει να διαχωρίσετε τους φόρτους εργασίας σας και να τους δρομολογήσετε σε διαφορετικούς καταναλωτές.

Εργαστήρια Redis

Μια ομάδα καταναλωτών κάνει περισσότερα από το διαχωρισμό δεδομένων - διασφαλίζει την ασφάλεια των δεδομένων και επιτρέπει την ανάκτηση καταστροφών.

Πώς λειτουργεί μια ομάδα καταναλωτών Redis Streams

Μια ομάδα καταναλωτών είναι μια δομή δεδομένων σε μια ροή Redis. Όπως φαίνεται στο Σχήμα 3, μπορείτε να σκεφτείτε μια ομάδα καταναλωτών ως μια συλλογή από λίστες. Ένα άλλο πράγμα που πρέπει να φανταστείτε είναι μια λίστα αντικειμένων που δεν καταναλώνονται από κανέναν καταναλωτή - για τη συζήτησή μας, ας το ονομάσουμε "μη καταναλώσιμη λίστα". Καθώς τα δεδομένα φτάνουν στη ροή, μεταφέρονται αμέσως στη λίστα που δεν καταναλώθηκε.

Εργαστήρια Redis

Η ομάδα καταναλωτών διατηρεί μια ξεχωριστή λίστα για κάθε καταναλωτή, συνήθως με μια συνημμένη εφαρμογή. Στο σχήμα 3, η λύση μας έχει Ν πανομοιότυπες εφαρμογές (App 1, App 2,…. App n) που διαβάζουν δεδομένα μέσω Consumer 1, Consumer 2,… Consumer n αντίστοιχα.

Όταν μια εφαρμογή διαβάζει δεδομένα χρησιμοποιώντας την εντολή XREADGROUP, συγκεκριμένες καταχωρίσεις δεδομένων αφαιρούνται από τη λίστα που δεν καταναλώθηκε και μεταφέρονται στη λίστα καταχωρήσεων σε εκκρεμότητα που ανήκει στον αντίστοιχο καταναλωτή. Έτσι, κανένας δύο καταναλωτής δεν θα καταναλώνει τα ίδια δεδομένα.

Τέλος, όταν η εφαρμογή ειδοποιεί τη ροή με την εντολή XACK, θα καταργήσει το στοιχείο από τη λίστα καταχωρήσεων που εκκρεμεί για τον καταναλωτή.

Τώρα που έχω εξηγήσει τα βασικά των ομάδων καταναλωτών, ας εμβαθύνουμε βαθύτερα στον τρόπο λειτουργίας αυτού του κύκλου ζωής δεδομένων.

Δημιουργία ομάδας καταναλωτών Redis Streams

Μπορείτε να δημιουργήσετε μια νέα ομάδα καταναλωτών χρησιμοποιώντας την εντολή XGROUP CREATE, όπως φαίνεται παρακάτω.

XGROUP CREATE mystream mygroup $ MKSTREAM

Όπως και με το XREAD, ένα σύμβολο $ στο τέλος της εντολής λέει στη ροή να παραδίδει μόνο νέα δεδομένα από εκείνο το χρονικό σημείο και μετά. Η εναλλακτική επιλογή είναι 0 ή άλλο αναγνωριστικό από την καταχώριση ροής. Όταν χρησιμοποιείτε το 0, η ροή θα παραδώσει όλα τα δεδομένα από την αρχή της ροής.

Το MKSTREAM δημιουργεί μια νέα ροή, mystream σε αυτήν την περίπτωση, εάν δεν υπάρχει ήδη.

Ανάγνωση και διαχείριση δεδομένων Redis Stream

Ας υποθέσουμε ότι έχετε μια ροή Redis (mystream) και έχετε ήδη δημιουργήσει μια ομάδα καταναλωτών (mygroup) όπως φαίνεται παραπάνω. Τώρα μπορείτε να προσθέσετε στοιχεία με ονόματα a, b, c, d, e όπως στο ακόλουθο παράδειγμα.

XADD mystream * όνομα α

Η εκτέλεση αυτής της εντολής για ονόματα a έως e θα συμπληρώσει το Redis Stream, το mystream και τη μη καταναλώσιμη λίστα του mystream της ομάδας καταναλωτών. Αυτό απεικονίζεται στο σχήμα 4.

Εργαστήρια Redis

Εδώ μπορείτε να δείτε ότι οι καταναλωτές Alice και Bob δεν έχουν ξεκινήσει ακόμα τη δουλειά τους. Η εφαρμογή A καταναλώνει δεδομένα μέσω του καταναλωτή Alice, ενώ η εφαρμογή B καταναλώνει δεδομένα μέσω του Bob.

Κατανάλωση δεδομένων Redis Streams

Η εντολή για ανάγνωση δεδομένων από μια ομάδα είναι XREADGROUP. Στο παράδειγμά μας, όταν η εφαρμογή Α ξεκινά την επεξεργασία δεδομένων, καλεί τον καταναλωτή (Alice) να πάρει δεδομένα, όπως στο:

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>

Ομοίως, η εφαρμογή Β διαβάζει τα δεδομένα μέσω του Bob, ως εξής:

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream>

Ο ειδικός χαρακτήρας> στο τέλος λέει στο Redis Streams να λαμβάνει μόνο καταχωρήσεις δεδομένων που δεν παραδίδονται σε άλλους καταναλωτές. Σημειώστε επίσης ότι κανένας δύο καταναλωτής δεν θα καταναλώνει τα ίδια δεδομένα, κάτι που θα έχει ως αποτέλεσμα τη μεταφορά δεδομένων από τη μη καταναλώσιμη λίστα στην Αλίκη και τον Μπομπ όπως φαίνεται στο Σχήμα 5.

Εργαστήρια Redis

Κατάργηση επεξεργασμένων μηνυμάτων από λίστες καταχωρήσεων σε εκκρεμότητα

Τα δεδομένα στις λίστες εκκρεμών καταχωρήσεων των καταναλωτών σας θα παραμείνουν εκεί έως ότου οι εφαρμογές A και App B αναγνωρίσουν στις Redis Streams ότι έχουν καταναλώσει με επιτυχία τα δεδομένα. Αυτό γίνεται χρησιμοποιώντας την εντολή XACK. Για παράδειγμα, η εφαρμογή Α θα αναγνωρίσει ως εξής μετά την κατανάλωση d και e, τα οποία έχουν τα αναγνωριστικά 1526569411111-0 και 1526569411112-0.

XACK mystream mygroup 1526569411111-0 1526569411112-0

Ο συνδυασμός XREADGROUP και XACK είναι ανάλογος με την έναρξη μιας συναλλαγής και την πραγματοποίησή της, η οποία διασφαλίζει την ασφάλεια των δεδομένων.

Αφού εκτελέσετε το XACK, ας υποθέσουμε ότι η εφαρμογή A εκτέλεσε το XREADGROUP όπως φαίνεται παρακάτω. Τώρα η δομή δεδομένων μοιάζει με το Σχήμα 6.

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>
Εργαστήρια Redis

Ανάκτηση από αποτυχίες

Εάν η εφαρμογή B τερματίστηκε λόγω αποτυχίας κατά την επεξεργασία b και c, τότε η δομή δεδομένων θα μοιάζει με το σχήμα 7.

Εργαστήρια Redis

Τώρα έχετε δύο επιλογές:

1. Επανεκκινήστε την εφαρμογή B και φορτώστε ξανά τα δεδομένα από τον καταναλωτή (Bob).

Σε αυτήν την περίπτωση, η εφαρμογή B πρέπει να διαβάσει δεδομένα από τον καταναλωτή σας (Bob) χρησιμοποιώντας την εντολή XREADGROUP, αλλά με μία διαφορά. Αντί> στο τέλος, η εφαρμογή B θα περάσει 0 (ή το αναγνωριστικό χαμηλότερο από την προηγούμενη καταχώριση δεδομένων που υποβλήθηκε σε επεξεργασία). Θυμηθείτε ότι> στέλνει νέα δεδομένα από τη λίστα που δεν καταναλώνονται στον καταναλωτή.

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream 0

Η παραπάνω εντολή θα ανακτήσει καταχωρήσεις δεδομένων που είναι ήδη αποθηκευμένα στη λίστα για τον καταναλωτή Bob. Δεν θα πάρει νέα δεδομένα από τη λίστα που δεν καταναλώθηκε. Η εφαρμογή B θα μπορούσε να επαναλάβει όλα τα δεδομένα στον καταναλωτή Bob πριν από τη λήψη νέων δεδομένων.

2. Αναγκάστε την Alice να διεκδικήσει όλα τα δεδομένα από τον Bob και να τα επεξεργαστεί μέσω της εφαρμογής A.

Αυτό είναι ιδιαίτερα χρήσιμο εάν δεν μπορείτε να ανακτήσετε την εφαρμογή B λόγω κόμβου, δίσκου ή αστοχίας δικτύου. Σε τέτοιες περιπτώσεις, οποιοσδήποτε άλλος καταναλωτής (όπως η Alice) μπορεί να διεκδικήσει τα δεδομένα του Bob και να συνεχίσει την επεξεργασία αυτών των δεδομένων, αποτρέποντας έτσι το χρόνο διακοπής της υπηρεσίας. Για να διεκδικήσετε τα δεδομένα του Bob, πρέπει να εκτελέσετε δύο σύνολα εντολών:

XPENDING mystream mygroup - + 10 Μπομπ

Αυτό θα πάρει όλες τις εκκρεμείς καταχωρήσεις δεδομένων για τον Μπομπ. Οι επιλογές - και + ανάκτηση ολόκληρου του εύρους. Εάν τα b και c είχαν τα ID 1526569411113-0 και 1526569411114-0 αντίστοιχα, η εντολή που θα μεταφέρει τα δεδομένα του Bob στην Alice έχει ως εξής:

XCLAIM mystream mygroup Alice 0 1526569411113-0 1526569411114-0

Οι ομάδες καταναλωτών διατηρούν ένα ρολόι λειτουργίας για δεδομένα στη λίστα καταναλωτών. Για παράδειγμα, όταν η εφαρμογή B διαβάζει b, το ρολόι ξεκινά μέχρι ο Bob να λάβει το ACK. Με την επιλογή ώρας στην εντολή XCLAIM, μπορείτε να πείτε στην ομάδα καταναλωτών να μετακινεί μόνο δεδομένα που είναι σε αδράνεια περισσότερο από έναν καθορισμένο χρόνο. Μπορείτε επίσης να το αγνοήσετε περνώντας 0 όπως φαίνεται στο παραπάνω παράδειγμα. Το αποτέλεσμα αυτών των εντολών απεικονίζεται στο Σχήμα 8. Το XCLAIM είναι επίσης χρήσιμο όταν ένας από τους επεξεργαστές καταναλωτών σας είναι αργός, με αποτέλεσμα την καθυστέρηση μη επεξεργασμένων δεδομένων.

Εργαστήρια Redis

Στο προηγούμενο άρθρο, καλύψαμε τα βασικά του τρόπου χρήσης του Redis Streams. Πήγαμε λίγο πιο βαθιά σε αυτό το άρθρο και εξηγήσαμε πότε να χρησιμοποιήσουμε ομάδες καταναλωτών και πώς λειτουργούν. Οι ομάδες καταναλωτών στο Redis Streams μειώνουν το βάρος σας όσον αφορά τη διαχείριση κατατμήσεων δεδομένων, του κύκλου ζωής τους και της ασφάλειας δεδομένων. Επιπλέον, οι δυνατότητες κλιμάκωσης των ομάδων καταναλωτών μπορούν να ωφελήσουν πολλές εφαρμογές σε πραγματικό χρόνο.

Σε ένα προσεχές τρίτο άρθρο για το Redis Streams, θα δείξω πώς να αναπτύξω μια εφαρμογή ταξινόμησης σε πραγματικό χρόνο χρησιμοποιώντας το Redis Streams και το Lettuce, μια βιβλιοθήκη ανοιχτού κώδικα με βάση την Java για το Redis. Εν τω μεταξύ, μπορείτε να μάθετε περισσότερα δουλεύοντας μέσω του οδηγού Redis Streams στον ιστότοπο του έργου Redis.

Ο Roshan Kumar είναι ανώτερος διευθυντής προϊόντων στοΕργαστήρια Redis. Έχει εκτεταμένη εμπειρία στην ανάπτυξη λογισμικού και στο μάρκετινγκ τεχνολογίας. Η Roshan έχει εργαστεί στο Hewlett-Packard και σε πολλές επιτυχημένες νεοσύστατες εταιρείες της Silicon Valley, συμπεριλαμβανομένων των ZillionTV, Salorix, Alopa και ActiveVideo. Ως ενθουσιώδης προγραμματιστής, σχεδίασε και ανέπτυξε το mindzeal.com, μια διαδικτυακή πλατφόρμα που φιλοξενεί μαθήματα προγραμματισμού υπολογιστών για νέους μαθητές. Ο Roshan είναι κάτοχος πτυχίου στην επιστήμη των υπολογιστών και MBA από το Πανεπιστήμιο Santa Clara.

Το New Tech Forum παρέχει έναν χώρο για να εξερευνήσετε και να συζητήσετε την αναδυόμενη τεχνολογία σε πρωτοφανές βάθος και εύρος. Η επιλογή είναι υποκειμενική, με βάση την επιλογή των τεχνολογιών που πιστεύουμε ότι είναι σημαντικές και έχουν μεγάλο ενδιαφέρον για τους αναγνώστες. δεν αποδέχεται ασφάλεια μάρκετινγκ για δημοσίευση και διατηρεί το δικαίωμα να επεξεργαστεί όλο το περιεχόμενο. Στείλτε όλες τις ερωτήσεις στο[email protected].