Kao web programeru, ključno je da vaše aplikacije rade što je brže moguće. Trebali biste izraditi web-aplikacije koje odgovaraju na zahtjeve u najbržem mogućem vremenu.
Jedna od mnogih tehnologija koje vam mogu pomoći jest čekanje zadataka.
Dakle, što je čekanje zadataka i kako ga možete koristiti za optimizaciju Node.js aplikacije?
Što je čekanje zadataka?
Postavljanje poruka u red čekanja je sredstvo asinkrone komunikacije između dvije aplikacije ili usluge, koje se obično naziva proizvođač i potrošač. To je dobro poznati koncept koji se koristi u arhitekturama bez poslužitelja i mikroservisima.
Koncept zadatak ili posaoČekanje u redu iskorištava red čekanja poruka za poboljšanje performansi aplikacije. Apstrahira složenost upravljanja porukama i omogućuje vam definiranje funkcija za asinkrono upravljanje poslovima ili zadacima pomoću reda čekanja, čime se smanjuje stopa korištenje memorije u nekim dijelovima aplikacije.
Najčešći primjer softvera za red poruka je RabbitMQ. Alati za red čekanja zadataka uključuju Celery i Bull. Također možete konfigurirati RabbitMQ da radi kao red čekanja zadataka. Čitajte dalje kako biste saznali o postavljanju zadataka u red čekanja u Node.js pomoću Bulla.
Što je BullMQ?
BullMQ (Bull.js) je biblioteka Node.js koja se koristi za implementaciju redova u Node aplikacijama. Bull je sustav temeljen na Redisu (možda ste više upoznati s Redisom kao alatom za brza pohrana podataka) i to je brza i pouzdana opcija koju treba razmotriti za čekanje zadataka u Node.js.
Možete koristiti Bull za mnoge zadatke kao što su implementacija odgođenih poslova, zakazanih poslova, ponovljivih poslova, prioritetnih redova i još mnogo toga.
Dakle, kako možete koristiti Bull i Redis za asinkrono pokretanje Node.js zadataka?
Kako konfigurirati Bull i Redis za čekanje zadataka u Node.js
Da biste započeli s čekanjem zadataka u Node.js s Bullom, na vašem računalu trebaju biti instalirani Node.js i Redis. Možete pratiti Redis laboratorijski vodič za instalaciju Redisa ako ga nemate instaliran.
Prvi korak u implementaciji Bulla je dodavanje ovisnosti vašeg projekta pokretanjem npm instalirati bull ili pređa dodati bik u terminalu unutar mape vašeg projekta. Postoji više načina za inicijaliziranje reda čekanja u Bull-u kao što je prikazano u nastavku:
konst Red čekanja = zahtijevati('bik');
// različiti načini inicijalizacije reda
// - pomoću redis URL niza
konst e-mailQueue = novi Red('Red e-pošte', 'redis://127.0.0.1:6379');// - s redis vezom i objektom opcija čekanja
konst videoQueue = novi Red('Red čekanja videozapisa', 'redis://127.0.0.1:6379', queueOptions);// - bez redis veze ali s queueOption
konst docQueue = novi Red('Red dokumenata', queueOptions);
// - bez redis veze ili opcija čekanja
konst QueueClient = novi Red('Moj red');
Svi oni koriste minimalnu konfiguraciju za Bull u Node.js. Objekt opcija podržava mnoga svojstva i o njima možete saznati u dio s opcijama čekanja u Bull-ovoj dokumentaciji.
Implementacija reda čekanja zadataka e-pošte pomoću BullMQ
Da biste implementirali red čekanja za slanje e-pošte, možete definirati svoju funkciju proizvođača koja dodaje e-poštu u red čekanja e-pošte i funkciju potrošača za upravljanje slanjem e-pošte.
Prvo, možete inicijalizirati svoj red čekanja u klasi koristeći Redis URL i neke opcije čekanja kao što je prikazano u nastavku.
// queueHandler.js
konst Red čekanja = zahtijevati('bik');// ovdje koristite pravi modul rukovatelja e-poštom - ovo je samo primjer
konst emailHandler = zahtijevati('./emailHandler.js');// definirajte konstante, Redis URL i opcije čekanja
konst REDIS_URL = 'redis://127.0.0.1:6379';konst queueOpts = {
// opcije ograničenja brzine kako bi se izbjeglo preopterećenje reda čekanja
limiter: {
// maksimalan broj zadataka koji red može primiti
max: 100,// vrijeme čekanja u milisekundama prije prihvaćanja novih poslova nakon
// dostizanje granice
trajanje: 10000
},
prefiks: 'EMAIL-TASK', // prefiks koji se dodaje svim ključevima reda čekanja
defaultJobOptions: { // zadane opcije za zadatke u redu
pokušaji: 3, // zadani broj puta za ponovni pokušaj zadatka// za uklanjanje zadatka iz reda nakon završetka
removeOnComplete: pravi
}
};razredaE-mailQueue{
konstruktor() {
ovaj.red = novi Red('Red e-pošte', REDIS_URL, queueOpts);
}
};
izvozzadano EmailQueue; // izvoz klase
Sada kada ste inicijalizirali red čekanja, možete definirati svoju funkciju proizvođača (koristeći Bull-ov dodati() funkcija) kao metoda E-mailQueue klasa za dodavanje e-pošte u red čekanja zadataka. Sljedeći blok koda to pokazuje:
// queueHandler.js
razredaE-mailQueue{
konstruktor () {
// ...
}// funkcija proizvođača za dodavanje e-pošte u red čekanja
asinkroni addEmailToQueue (emailData) {
// dodaj zadatak s nazivom 'email_notification' u red čekanja
čekatiovaj.queue.add('e-mail_notification', emailData);
konzola.log('e-pošta je dodana u red čekanja...');
}
};
izvozzadano EmailQueue; // izvoz klase
Funkcija proizvođača je spremna i sada možete definirati funkciju potrošača (koristeći Bull's postupak() funkcija) za obradu svih zadataka e-pošte u redu čekanja—tj. pozovite funkciju za slanje e-pošte. Trebali biste definirati ovu potrošačku funkciju u konstruktoru klase.
// queueHandler.js
razredaE-mailQueue{
konstruktor () {
// ...// potrošačka funkcija koja preuzima dodijeljeno ime zadatka i
// funkcija povratnog poziva
ovaj.queue.process('e-mail_notification', asinkroni (e-mailJob, gotovo) => {
konzola.log('obrada zadatka obavijesti putem e-pošte');
čekati emailHandler.sendEmail (emailJob); // pošalji e-mail
gotovo(); // izvršiti zadatak
})
}
// ...
};
izvozzadano EmailQueue; // izvoz klase
Posao također može imati opcije za definiranje svog ponašanja u redu ili kako potrošačka funkcija njime rukuje. Više o tome možete saznati u odjeljak s opcijama poslova u Bull-ovoj dokumentaciji.
The emailJob argument je objekt koji sadrži svojstva zadatka za obradu u redu. Također uključuje glavne podatke potrebne za izradu e-pošte. Za lakše razumijevanje, Pošalji e-mail() funkcija bi bila slična ovom primjeru:
// emailHandler.js
konst sendgridMail = zahtijevati('@sendgrid/mail');konst apiKey = proces.env. SENDGRID_API_KEY
sendgridMail.setApiKey (apiKey); // postavljanje sigurnosnih vjerodajnica prijenosnika e-pošte
konst pošalji e-poštu = asinkroni (emailJob) => {
probati {
// izdvojiti podatke e-pošte iz posla
konst { ime, email } = emailJob.data;konst poruka = {
iz: '[email protected]',
do: '[email protected]',
predmet: 'Bok! Dobrodošli',
tekst: `Zdravo ${name}, dobrodošli u MUO`
};čekati sendgridMail.sendMail (poruka); // Pošalji e-mail
// označi zadatak kao dovršen u redu čekanja
čekati emailJob.moveToCompleted('gotovo', pravi);
konzola.log('E-pošta je uspješno poslana...');
} ulov (pogreška) {
// premjesti zadatak na neuspjele poslove
čekati emailJob.moveToFailed({ poruka: 'obrada zadatka nije uspjela..' });
konzola.greška (greška); // zabilježi grešku
}
}
izvozzadano Pošalji e-mail;
Sada kada imate i proizvođačku i potrošačku funkciju definiranu i spremnu za korištenje, sada možete pozvati svoju proizvođačku funkciju bilo gdje u svojoj aplikaciji kako biste dodali e-poštu u red čekanja za obradu.
Primjer kontrolera bi izgledao ovako:
// userController.js
konst E-mailQueue = zahtijevati('../handlers/queueHandler.js')konst prijava = asinkroni (req, res) => {
konst {ime, email, lozinka} = req.body;// --
// upit za dodavanje novog korisnika u bazu podataka...
// --// dodaj u red čekanja e-pošte
konst emailData = {ime, email};
čekati EmailQueue.addEmailToQueue (emailData);
res.status(200).json({
poruka: "Registracija je uspjela, provjerite svoju e-poštu"
})
}
Vaš queueHandler.js datoteka bi sada trebala biti sljedeća:
// queueHandler.js
konst Red čekanja = zahtijevati('bik');
konst emailHandler = zahtijevati('../handlers/emailHandler.js');konst REDIS_URL = 'redis://127.0.0.1:6379';
konst queueOpts = {
limiter: {
max: 100,
trajanje: 10000
},prefiks: 'EMAIL-TASK',
defaultJobOptions: {
pokušaji: 3,
removeOnComplete: pravi
}
};razredaE-mailQueue{
konstruktor() {
ovaj.red = novi Red('Red e-pošte', REDIS_URL, queueOpts);// potrošač
ovaj.queue.process('e-mail_notification', asinkroni (e-mailJob, gotovo) => {
konzola.log('obrada zadatka obavijesti putem e-pošte');
čekati emailHandler.sendEmail (emailJob);
gotovo();
})
}// producent
asinkroni addEmailToQueue (emailData) {
// dodaj zadatak s nazivom 'email_notification' u red čekanja
čekatiovaj.queue.add('e-mail_notification', emailData);
konzola.log('e-pošta je dodana u red čekanja...');
}
};
izvozzadano EmailQueue;
Kada ovo implementirate u Node.js REST API, primijetit ćete smanjenje vremena odgovora krajnje točke prijave i brže vrijeme isporuke e-pošte u usporedbi s alternativom.
Redovi čekanja zadataka također su vam omogućili da neovisno rješavate pogreške prijave i e-pošte.
Optimiziranje aplikacija pomoću redova zadataka
Redovi poruka i zadataka izvrstan su način za poboljšanje opće izvedbe aplikacija. Također su vrlo jeftini i možete ih koristiti u onoliko dijelova aplikacije koliko vam je potrebno.
Iako je ovaj vodič koristio e-poštu kao primjer scenarija za rukovanje zadacima koji troše memoriju s redovima čekanja, postoje mnogi drugi slučajevi u kojima možete primijeniti iste koncepte. To uključuje teške operacije čitanja/pisanja, renderiranje visokokvalitetnih slika ili dokumenata i slanje skupnih obavijesti.