Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju. Čitaj više.

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.

instagram viewer

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.