Ως προγραμματιστής ιστού, είναι σημαντικό οι εφαρμογές σας να αποδίδουν όσο πιο γρήγορα μπορούν. Θα πρέπει να δημιουργήσετε εφαρμογές ιστού που ανταποκρίνονται σε αιτήματα το συντομότερο δυνατό.
Μία από τις πολλές τεχνολογίες που μπορούν να σας βοηθήσουν είναι η ουρά εργασιών.
Λοιπόν, τι είναι η ουρά εργασιών και πώς μπορείτε να τη χρησιμοποιήσετε για να βελτιστοποιήσετε μια εφαρμογή Node.js;
Τι είναι η ουρά εργασιών;
Η ουρά μηνυμάτων είναι ένα μέσο ασύγχρονης επικοινωνίας μεταξύ δύο εφαρμογών ή υπηρεσιών, που συνήθως αναφέρεται ως παραγωγός και καταναλωτής. Είναι μια πολύ γνωστή ιδέα που χρησιμοποιείται σε αρχιτεκτονικές χωρίς διακομιστή και μικροϋπηρεσίες.
Η εννοια του έργο ή δουλειάουρά αξιοποιεί την ουρά μηνυμάτων για να βελτιώσει την απόδοση της εφαρμογής. Αφαιρεί την πολυπλοκότητα της διαχείρισης των μηνυμάτων και σας δίνει τη δυνατότητα να ορίσετε λειτουργίες για τη διαχείριση εργασιών ή εργασιών ασύγχρονα χρησιμοποιώντας μια ουρά, μειώνοντας έτσι τον ρυθμό
χρήση μνήμης σε ορισμένα μέρη μιας εφαρμογής.Το πιο συνηθισμένο παράδειγμα λογισμικού ουράς μηνυμάτων είναι το RabbitMQ. Τα εργαλεία ουράς εργασιών περιλαμβάνουν το Celery και το Bull. Μπορείτε επίσης να διαμορφώσετε το RabbitMQ ώστε να λειτουργεί ως ουρά εργασιών. Διαβάστε παρακάτω για να μάθετε σχετικά με την ουρά εργασιών στο Node.js χρησιμοποιώντας το Bull.
Τι είναι το BullMQ;
Το BullMQ (Bull.js) είναι μια βιβλιοθήκη Node.js που χρησιμοποιείται για την υλοποίηση ουρών σε εφαρμογές Node. Το Bull είναι ένα σύστημα που βασίζεται στο Redis (ίσως να είστε πιο εξοικειωμένοι με το Redis ως εργαλείο για γρήγορη αποθήκευση δεδομένων) και είναι μια γρήγορη και αξιόπιστη επιλογή που πρέπει να εξετάσετε για την ουρά εργασιών στο Node.js.
Μπορείτε να χρησιμοποιήσετε το Bull για πολλές εργασίες, όπως η υλοποίηση καθυστερημένων εργασιών, προγραμματισμένων εργασιών, επαναλαμβανόμενων εργασιών, ουρών προτεραιότητας και πολλών άλλων.
Λοιπόν, πώς μπορείτε να χρησιμοποιήσετε το Bull και το Redis για να εκτελέσετε εργασίες Node.js ασύγχρονα;
Πώς να ρυθμίσετε το Bull και το Redis για την ουρά εργασιών στο Node.js
Για να ξεκινήσετε με την ουρά εργασιών στο Node.js με Bull, χρειάζεστε εγκατεστημένο το Node.js και το Redis στον υπολογιστή σας. Μπορείτε να ακολουθήσετε το Οδηγός εργαστηρίων Redis για την εγκατάσταση του Redis αν δεν το έχετε εγκατεστημένο.
Το πρώτο βήμα για την εφαρμογή του Bull είναι να το προσθέσετε στις εξαρτήσεις του έργου σας εκτελώντας npm εγκατάσταση bull ή νήμα προσθέτω ταύρο στο τερματικό μέσα στο φάκελο του έργου σας. Υπάρχουν πολλοί τρόποι για να αρχικοποιήσετε μια ουρά στο Bull όπως φαίνεται παρακάτω:
συνθ Ουρά = απαιτώ('ταύρος');
// διαφορετικοί τρόποι για την προετοιμασία μιας ουράς
// - χρησιμοποιώντας συμβολοσειρά URL redis
συνθ ουρά email = νέος Ουρά('Ουρά email', 'redis://127.0.0.1:6379');// - με μια σύνδεση redis και ένα αντικείμενο επιλογών ουράς
συνθ Ουρά βίντεο = νέος Ουρά('Ουρά βίντεο', 'redis://127.0.0.1:6379', ουράΕπιλογές);// - χωρίς σύνδεση redis αλλά με queueOption
συνθ docQueue = νέος Ουρά("Ουρά εγγράφων", ουράΕπιλογές);
// - χωρίς σύνδεση redis ή επιλογές ουράς
συνθ QueueClient = νέος Ουρά("Η ουρά μου");
Όλα αυτά χρησιμοποιούν ελάχιστες ρυθμίσεις παραμέτρων για το Bull στο Node.js. Το αντικείμενο επιλογές υποστηρίζει πολλές ιδιότητες και μπορείτε να μάθετε για αυτές στο ενότητα επιλογών ουράς της τεκμηρίωσης του Bull.
Εφαρμογή μιας ουράς εργασιών ηλεκτρονικού ταχυδρομείου χρησιμοποιώντας το BullMQ
Για να εφαρμόσετε μια ουρά για την αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου, μπορείτε να ορίσετε τη λειτουργία παραγωγού που προσθέτει μηνύματα ηλεκτρονικού ταχυδρομείου στην ουρά email και μια συνάρτηση καταναλωτή για τη διαχείριση της αποστολής μηνυμάτων ηλεκτρονικού ταχυδρομείου.
Πρώτον, μπορείτε να αρχικοποιήσετε την ουρά σας σε μια τάξη χρησιμοποιώντας μια διεύθυνση URL Redis και ορισμένες επιλογές ουράς όπως φαίνεται παρακάτω.
// queueHandler.js
συνθ Ουρά = απαιτώ('ταύρος');// χρησιμοποιήστε μια πραγματική ενότητα χειριστή email εδώ - αυτό είναι απλώς ένα παράδειγμα
συνθ email Handler = απαιτώ("./emailHandler.js");// ορίστε σταθερές, URL Redis και επιλογές ουράς
συνθ REDIS_URL = 'redis://127.0.0.1:6379';συνθ queueOpts = {
// Επιλογές περιοριστή ρυθμού για την αποφυγή υπερφόρτωσης της ουράς
περιοριστής: {
// μέγιστος αριθμός εργασιών που μπορεί να λάβει η ουρά
Μέγιστη: 100,// χρόνος αναμονής σε χιλιοστά του δευτερολέπτου πριν αποδεχτείτε νέες εργασίες μετά
// φθάνοντας το όριο
διάρκεια: 10000
},
πρόθεμα: 'EMAIL-TASK', // ένα πρόθεμα που θα προστεθεί σε όλα τα πλήκτρα ουράς
defaultJobOptions: { // προεπιλεγμένες επιλογές για εργασίες στην ουρά
προσπάθειες: 3, // προεπιλεγμένος αριθμός φορών για να δοκιμάσετε ξανά μια εργασία// για να αφαιρέσετε μια εργασία από την ουρά μετά την ολοκλήρωση
removeOnComplete: αληθής
}
};τάξηEmail Queue{
κατασκευαστής() {
Αυτό.ουρά = νέος Ουρά('Ουρά email', REDIS_URL, queueOpts);
}
};
εξαγωγήΠροκαθορισμένο EmailQueue; // εξαγωγή της κλάσης
Τώρα που αρχικοποιήσατε μια ουρά, μπορείτε να ορίσετε τη συνάρτηση παραγωγού (χρησιμοποιώντας Bull's Προσθήκη() λειτουργία) ως μέθοδος του Email Queue τάξη για να προσθέσετε email στην ουρά εργασιών. Το παρακάτω μπλοκ κώδικα το δείχνει αυτό:
// queueHandler.js
τάξηEmail Queue{
κατασκευαστής () {
// ...
}// συνάρτηση παραγωγού για προσθήκη email στην ουρά
ασυγχρονισμός addEmailToQueue (emailData) {
// προσθήκη εργασίας με όνομα 'email_notification' στην ουρά
αναμένωΑυτό.queue.add('Ειδοποίηση ηλεκτρονικού ταχυδρομείου', emailData);
κονσόλα.κούτσουρο("Το email έχει προστεθεί στην ουρά...");
}
};
εξαγωγήΠροκαθορισμένο EmailQueue; // εξαγωγή της κλάσης
Η συνάρτηση παραγωγού είναι έτοιμη και μπορείτε τώρα να ορίσετε μια συνάρτηση καταναλωτή (χρησιμοποιώντας Bull's επεξεργάζομαι, διαδικασία() λειτουργία) για την επεξεργασία όλων των εργασιών email στην ουρά—δηλ. καλέστε τη λειτουργία για να στείλετε ένα email. Θα πρέπει να ορίσετε αυτήν τη συνάρτηση καταναλωτή στον κατασκευαστή της κλάσης.
// queueHandler.js
τάξηEmail Queue{
κατασκευαστής () {
// ...// συνάρτηση καταναλωτή που λαμβάνει το εκχωρημένο όνομα της εργασίας και
// συνάρτηση επανάκλησης
Αυτό.queue.process('Ειδοποίηση ηλεκτρονικού ταχυδρομείου', ασυγχρονισμός (email δουλειά, έγινε) => {
κονσόλα.κούτσουρο("επεξεργασία εργασίας ειδοποίησης email");
αναμένω emailHandler.sendEmail (emailJob); // στείλτε το email
Έγινε(); // ολοκληρώστε την εργασία
})
}
// ...
};
εξαγωγήΠροκαθορισμένο EmailQueue; // εξαγωγή της κλάσης
Μια εργασία μπορεί επίσης να έχει επιλογές για να ορίσει τη συμπεριφορά της στην ουρά ή πώς τη χειρίζεται η λειτουργία καταναλωτή. Μπορείτε να μάθετε περισσότερα για αυτό στο ενότητα επιλογών εργασίας της τεκμηρίωσης του Bull.
ο email Εργασία Το όρισμα είναι ένα αντικείμενο που περιέχει τις ιδιότητες της εργασίας για την επεξεργασία της ουράς. Περιλαμβάνει επίσης τα κύρια δεδομένα που απαιτούνται για την κατασκευή του email. Για εύκολη κατανόηση, το να στείλετε e-mail() η λειτουργία θα είναι παρόμοια με αυτό το παράδειγμα:
// emailHandler.js
συνθ sendgridMail = απαιτώ('@sendgrid/mail');συνθ apiKey = διεργασία.env. SENDGRID_API_KEY
sendgridMail.setApiKey (apiKey); // ορίστε τα διαπιστευτήρια ασφαλείας του μεταφορέα email
συνθ sendEmail = ασυγχρονισμός (emailJob) => {
δοκιμάστε {
// εξαγάγετε τα δεδομένα email από την εργασία
συνθ { name, email } = emailJob.data;συνθ μήνυμα = {
από: '[email protected]',
προς την: '[email protected]',
θέμα: 'Γεια! Καλως ΗΡΘΑΤΕ',
κείμενο: `Γεια σας ${name}, καλώς ήρθατε στο MUO`
};αναμένω sendgridMail.sendMail (μήνυμα); // να στείλετε e-mail
// επισήμανση της εργασίας ως ολοκληρωμένης στην ουρά
αναμένω emailJob.moveToCompleted('Έγινε', αληθής);
κονσόλα.κούτσουρο("Το email εστάλη με επιτυχία...");
} σύλληψη (λάθος) {
// μετακινήστε την εργασία σε αποτυχημένες εργασίες
αναμένω emailJob.moveToFailed({ μήνυμα: 'Η επεξεργασία εργασιών απέτυχε..' });
κονσόλα.λάθος (σφάλμα); // καταγραφή του σφάλματος
}
}
εξαγωγήΠροκαθορισμένο να στείλετε e-mail;
Τώρα που έχετε ορίσει τις λειτουργίες παραγωγού και καταναλωτή και είναι έτοιμες για χρήση, μπορείτε τώρα να καλέσετε τη λειτουργία παραγωγού οπουδήποτε στην εφαρμογή σας για να προσθέσετε ένα email στην ουρά για επεξεργασία.
Ένα παράδειγμα ελεγκτή θα μοιάζει με αυτό:
// userController.js
συνθ Email Queue = απαιτώ("../handlers/queueHandler.js")συνθ εγγραφή = ασυγχρονισμός (απαιτ., ανταπ.) => {
συνθ { όνομα, email, κωδικός πρόσβασης } = req.body;// --
// ένα ερώτημα για την προσθήκη του νέου χρήστη στη βάση δεδομένων...
// --// προσθήκη στην ουρά email
συνθ emailData = { name, email };
αναμένω EmailQueue.addEmailToQueue (emailData);
res.status(200).json({
μήνυμα: "Η εγγραφή είναι επιτυχής, ελέγξτε το email σας"
})
}
Τα δικα σου queueHandler.js το αρχείο θα πρέπει τώρα να είναι ως εξής:
// queueHandler.js
συνθ Ουρά = απαιτώ('ταύρος');
συνθ email Handler = απαιτώ("../handlers/emailHandler.js");συνθ REDIS_URL = 'redis://127.0.0.1:6379';
συνθ queueOpts = {
περιοριστής: {
Μέγιστη: 100,
διάρκεια: 10000
},πρόθεμα: 'EMAIL-TASK',
defaultJobOptions: {
προσπάθειες: 3,
removeOnComplete: αληθής
}
};τάξηEmail Queue{
κατασκευαστής() {
Αυτό.ουρά = νέος Ουρά('Ουρά email', REDIS_URL, queueOpts);// καταναλωτής
Αυτό.queue.process('Ειδοποίηση ηλεκτρονικού ταχυδρομείου', ασυγχρονισμός (email δουλειά, έγινε) => {
κονσόλα.κούτσουρο("επεξεργασία εργασίας ειδοποίησης email");
αναμένω emailHandler.sendEmail (emailJob);
Έγινε();
})
}// παραγωγός
ασυγχρονισμός addEmailToQueue (emailData) {
// προσθήκη εργασίας με όνομα 'email_notification' στην ουρά
αναμένωΑυτό.queue.add('Ειδοποίηση ηλεκτρονικού ταχυδρομείου', emailData);
κονσόλα.κούτσουρο("Το email έχει προστεθεί στην ουρά...");
}
};
εξαγωγήΠροκαθορισμένο EmailQueue;
Όταν το εφαρμόζετε σε ένα Node.js REST API, θα παρατηρήσετε μείωση του χρόνου απόκρισης του τελικού σημείου εγγραφής και ταχύτερους χρόνους παράδοσης email, σε σύγκριση με την εναλλακτική.
Οι ουρές εργασιών σάς επέτρεψαν επίσης να χειρίζεστε ανεξάρτητα τα σφάλματα εγγραφής και email.
Βελτιστοποίηση εφαρμογών με χρήση ουρών εργασιών
Οι ουρές μηνυμάτων και εργασιών είναι ένας πολύ καλός τρόπος για τη βελτίωση της γενικής απόδοσης των εφαρμογών. Είναι επίσης πολύ φθηνά και μπορείτε να τα χρησιμοποιήσετε σε όσα μέρη μιας εφαρμογής χρειάζεστε.
Αν και αυτό το σεμινάριο χρησιμοποίησε μηνύματα ηλεκτρονικού ταχυδρομείου ως παράδειγμα σεναρίου για τον χειρισμό εργασιών που καταναλώνουν μνήμη με ουρές, υπάρχουν πολλές άλλες περιπτώσεις όπου μπορείτε να εφαρμόσετε τις ίδιες έννοιες. Αυτές περιλαμβάνουν βαριές λειτουργίες ανάγνωσης/εγγραφής, απόδοση εικόνων ή εγγράφων υψηλής ποιότητας και αποστολή μαζικών ειδοποιήσεων.