Kā tīmekļa izstrādātājam ir ļoti svarīgi, lai jūsu lietotnes darbotos pēc iespējas ātrāk. Jums vajadzētu izveidot tīmekļa lietotnes, kas atbild uz pieprasījumiem pēc iespējas ātrāk.
Viena no daudzajām tehnoloģijām, kas var jums palīdzēt, ir uzdevumu rindas veidošana.
Tātad, kas ir uzdevumu rindas veidošana un kā to izmantot, lai optimizētu lietojumprogrammu Node.js?
Kas ir uzdevumu rindas veidošana?
Ziņojumu rinda ir asinhronas saziņas līdzeklis starp divām lietojumprogrammām vai pakalpojumiem, ko parasti dēvē par ražotājs un patērētājs. Tas ir labi zināms jēdziens, ko izmanto bezserveru un mikropakalpojumu arhitektūrā.
Jēdziens par uzdevums vai darbsrindā izmanto ziņojumu rindas, lai uzlabotu lietojumprogrammu veiktspēju. Tas abstrahē ziņojumu pārvaldības sarežģītību un ļauj definēt funkcijas, lai pārvaldītu darbus vai uzdevumus asinhroni, izmantojot rindu, tādējādi samazinot atmiņas lietojums dažās lietojumprogrammas daļās.
Visizplatītākais ziņojumu rindas programmatūras piemērs ir RabbitMQ. Uzdevumu rindas rīki ietver Selery un Bull. Varat arī konfigurēt RabbitMQ, lai tā darbotos kā uzdevumu rinda. Lasiet tālāk, lai uzzinātu par uzdevumu rindošanu pakalpojumā Node.js, izmantojot Bull.
Kas ir BullMQ?
BullMQ (Bull.js) ir Node.js bibliotēka, ko izmanto rindu ieviešanai Node lietojumprogrammās. Bull ir sistēma, kuras pamatā ir Redis (iespējams, jūs vairāk pazīstat Redis kā rīku, kas paredzēts ātra datu glabāšana), un tā ir ātra un uzticama iespēja, kas jāapsver uzdevumu rindā Node.js.
Varat izmantot Bull daudziem uzdevumiem, piemēram, aizkavētu darbu, ieplānotu darbu, atkārtojamu darbu, prioritāro rindu un daudz ko citu.
Tātad, kā jūs varat izmantot Bull un Redis, lai asinhroni palaistu Node.js uzdevumus?
Kā konfigurēt Bull un Redis uzdevumu rindai pakalpojumā Node.js
Lai sāktu darbu ar uzdevumu rindā Node.js ar Bull, datorā ir jāinstalē Node.js un Redis. Jūs varat sekot Redis laboratorijas rokasgrāmata Redis instalēšanai ja jums tas nav instalēts.
Pirmais Bull ieviešanas solis ir pievienot to sava projekta atkarībām, palaižot npm instalēt bulli vai dzija pievienot bulli terminālī, kas atrodas jūsu projekta mapē. Ir vairāki veidi, kā inicializēt rindu Bull, kā parādīts tālāk:
konst Rinda = pieprasīt('bullis');
// dažādi veidi, kā inicializēt rindu
// - izmantojot redis URL virkni
konst emailQueue = jauns rinda("E-pasta rinda", "redis://127.0.0.1:6379");// - ar redis savienojumu un rindas opciju objektu
konst videoRinda = jauns rinda("Video rinda", "redis://127.0.0.1:6379", rinduOpcijas);// - bez redis savienojuma, bet ar queueOption
konst docQueue = jauns rinda("Dokumentu rinda", rinduOpcijas);
// - bez redis savienojuma vai rindas opcijām
konst QueueClient = jauns rinda("Mana rinda");
Tie visi izmanto minimālu Bull konfigurāciju pakalpojumā Node.js. Opciju objekts atbalsta daudzus rekvizītus, un par tiem varat uzzināt šeit rindu opciju sadaļa Bull dokumentācijā.
E-pasta uzdevumu rindas ieviešana, izmantojot BullMQ
Lai ieviestu rindu e-pasta sūtīšanai, varat definēt savu producenta funkciju, kas pievieno e-pasta ziņojumus e-pasta rindai, un patērētāja funkciju, lai apstrādātu e-pasta ziņojumu sūtīšanu.
Pirmkārt, varat inicializēt savu rindu klasē, izmantojot Redis URL un dažas rindas opcijas, kā parādīts tālāk.
// queueHandler.js
konst Rinda = pieprasīt('bullis');// šeit izmantojiet īstu e-pasta apstrādātāja moduli - tas ir tikai piemērs
konst emailHandler = pieprasīt('./emailHandler.js');// definēt konstantes, Redis URL un rindas opcijas
konst REDIS_URL = "redis://127.0.0.1:6379";konst queueOpts = {
// likmes ierobežotāja opcijas, lai izvairītos no rindas pārslodzes
ierobežotājs: {
// maksimālais uzdevumu skaits, ko var aizņemt rinda
maks.: 100,// laiks, kas jāgaida milisekundēs, pirms pieņemt jaunus darbus pēc
// sasniedzot robežu
ilgums: 10000
},
priedēklis: 'EMAIL-UZDEVUMI', // prefikss, kas jāpievieno visām rindas atslēgām
noklusējumaDarbaOpcijas: { // noklusējuma opcijas uzdevumiem rindā
mēģinājumi: 3, // noklusējuma reižu skaits, lai atkārtotu uzdevumu// lai noņemtu uzdevumu no rindas pēc pabeigšanas
RemoveOnComplete: taisnība
}
};klasēEmailQueue{
konstruktors() {
šis.rinda = jauns rinda("E-pasta rinda", REDIS_URL, queueOpts);
}
};
eksportētnoklusējuma EmailQueue; // eksportēt klasi
Tagad, kad esat inicializējis rindu, varat definēt savu producenta funkciju (izmantojot Bull's pievienot () funkcija) kā metode EmailQueue klasē, lai pievienotu e-pastus uzdevumu rindai. To parāda šāds koda bloks:
// queueHandler.js
klasēEmailQueue{
konstruktors () {
// ...
}// ražotāja funkcija, lai rindai pievienotu e-pastus
asinhrons addEmailToQueue (emailData) {
// pievienot rindai uzdevumu ar nosaukumu 'email_notification'
gaidītšis.queue.add('email_notification', e-pastsDati);
konsole.log('e-pasts ir pievienots rindai...');
}
};
eksportētnoklusējuma EmailQueue; // eksportēt klasi
Ražotāja funkcija ir gatava, un tagad varat definēt patērētāja funkciju (izmantojot Bull's process () funkcija), lai apstrādātu visus rindā esošos e-pasta uzdevumus, t.i. izsauciet funkciju, lai nosūtītu e-pastu. Šī patērētāja funkcija ir jādefinē klases konstruktorā.
// queueHandler.js
klasēEmailQueue{
konstruktors () {
// ...// patērētāja funkcija, kas uzņem uzdevumam piešķirto nosaukumu un
// atzvanīšanas funkcija
šis.queue.process('email_notification', asinhrons (e-pastsDarbs, darīts) => {
konsole.log("E-pasta paziņojumu apstrādes uzdevums");
gaidīt emailHandler.sendEmail (emailJob); // nosūtīt e-pastu
darīts (); // pabeidz uzdevumu
})
}
// ...
};
eksportētnoklusējuma EmailQueue; // eksportēt klasi
Darbam var būt arī iespējas definēt tā darbību rindā vai to, kā patērētāja funkcija to apstrādā. Vairāk par to varat uzzināt sadaļā darba iespēju sadaļu Bull dokumentācijā.
The e-pastsDarbs arguments ir objekts, kas satur uzdevuma rekvizītus, kas jāapstrādā rindai. Tas ietver arī galvenos datus, kas nepieciešami e-pasta izveidei. Vieglākai izpratnei, sūtīt e-pastu() funkcija būtu līdzīga šim piemēram:
// emailHandler.js
konst sendgridMail = pieprasīt('@sendgrid/mail');konst apiKey = process.env. SENDGRID_API_KEY
sendgridMail.setApiKey (apiKey); // iestatiet e-pasta transportētāja drošības akreditācijas datus
konst sendEmail = asinhrons (e-pastsDarbs) => {
mēģināt {
// izvelciet e-pasta datus no darba
konst {vārds, e-pasts} = e-pastsDarbs.dati;konst ziņa = {
no: "[email protected]",
uz: "jū[email protected]",
tēma: 'Sveiki! Laipni lūdzam',
teksts: `Labdien ${name}, laipni lūdzam MUO`
};gaidīt sendgridMail.sendMail (ziņa); // sūtīt e-pastu
// rindā atzīmējiet uzdevumu kā pabeigtu
gaidīt emailJob.moveToCompleted('pabeigts', taisnība);
konsole.log("E-pasts veiksmīgi nosūtīts...");
} noķert (kļūda) {
// pārvietot uzdevumu uz neveiksmīgiem darbiem
gaidīt emailJob.moveToFailed({ ziņa: 'uzdevuma apstrāde neizdevās..' });
konsole.error (kļūda); // reģistrēt kļūdu
}
}
eksportētnoklusējuma sūtīt e-pastu;
Tagad, kad ir definētas un gatavas lietošanai gan ražotāja, gan patērētāja funkcijas, varat izsaukt ražotāja funkciju jebkurā lietojumprogrammā, lai pievienotu e-pasta ziņojumu apstrādes rindai.
Kontroliera piemērs izskatītos šādi:
// userController.js
konst EmailQueue = pieprasīt("../handlers/queueHandler.js")konst pierakstīšanās = asinhrons (req, res) => {
konst { name, email, password } = req.body;// --
// vaicājums, lai datu bāzei pievienotu jaunu lietotāju...
// --// pievienot e-pasta rindai
konst emailData = {vārds, e-pasts};
gaidīt EmailQueue.addEmailToQueue (emailData);
res.status(200).json({
ziņa: "Reģistrēšanās veiksmīga, lūdzu pārbaudiet savu e-pastu"
})
}
Jūsu queueHandler.js failam tagad jābūt šādam:
// queueHandler.js
konst Rinda = pieprasīt('bullis');
konst emailHandler = pieprasīt("../handlers/emailHandler.js");konst REDIS_URL = "redis://127.0.0.1:6379";
konst queueOpts = {
ierobežotājs: {
maks.: 100,
ilgums: 10000
},priedēklis: 'EMAIL-UZDEVUMI',
noklusējumaDarbaOpcijas: {
mēģinājumi: 3,
RemoveOnComplete: taisnība
}
};klasēEmailQueue{
konstruktors() {
šis.rinda = jauns rinda("E-pasta rinda", REDIS_URL, queueOpts);// patērētājs
šis.queue.process('email_notification', asinhrons (e-pastsDarbs, darīts) => {
konsole.log("E-pasta paziņojumu apstrādes uzdevums");
gaidīt emailHandler.sendEmail (emailJob);
darīts ();
})
}// producents
asinhrons addEmailToQueue (emailData) {
// pievienot rindai uzdevumu ar nosaukumu 'email_notification'
gaidītšis.queue.add('email_notification', e-pastsDati);
konsole.log('e-pasts ir pievienots rindai...');
}
};
eksportētnoklusējuma EmailQueue;
Ieviešot to Node.js REST API, pamanīsit reģistrēšanās galapunkta reakcijas laika samazināšanos un ātrāku e-pasta piegādes laiku, salīdzinot ar alternatīvu.
Uzdevumu rindas arī ļāva jums neatkarīgi apstrādāt reģistrācijas un e-pasta kļūdas.
Lietojumprogrammu optimizēšana, izmantojot uzdevumu rindas
Ziņojumu un uzdevumu rindas ir lielisks veids, kā uzlabot lietojumprogrammu vispārējo veiktspēju. Tie ir arī ļoti lēti, un tos varat izmantot tik daudzās lietojumprogrammas daļās, cik nepieciešams.
Lai gan šajā apmācībā e-pasta ziņojumi tika izmantoti kā piemērs, lai apstrādātu atmiņu patērējošus uzdevumus ar rindām, ir daudz citu gadījumu, kad varat izmantot tos pašus jēdzienus. Tie ietver smagas lasīšanas/rakstīšanas darbības, augstas kvalitātes attēlu vai dokumentu renderēšanu un lielapjoma paziņojumu izsūtīšanu.