Pre webového vývojára je dôležité, aby vaše aplikácie fungovali čo najrýchlejšie. Mali by ste vytvárať webové aplikácie, ktoré reagujú na požiadavky v čo najrýchlejšom čase.
Jednou z mnohých technológií, ktoré vám môžu pomôcť, je radenie úloh.
Čo je teda zaraďovanie úloh do frontu a ako ho môžete použiť na optimalizáciu aplikácie Node.js?
Čo je radenie úloh?
Radenie správ je prostriedok asynchrónnej komunikácie medzi dvoma aplikáciami alebo službami, zvyčajne označovaný ako výrobca a spotrebiteľ. Je to dobre známy koncept používaný v architektúrach bez serverov a mikroslužieb.
Koncept úloha alebo prácuradenie využíva radenie správ na zlepšenie výkonu aplikácie. Abstrahuje zložitosť správy správ a umožňuje vám definovať funkcie na správu úloh alebo úloh asynchrónne pomocou frontu, čím sa zníži rýchlosť Využitie pamäte v niektorých častiach aplikácie.
Najbežnejším príkladom softvéru pre fronty správ je RabbitMQ. Nástroje fronty úloh zahŕňajú zeler a býk. Môžete tiež nakonfigurovať RabbitMQ tak, aby fungoval ako front úloh. Čítajte ďalej, aby ste sa dozvedeli o radení úloh v Node.js pomocou Bull.
čo je BullMQ?
BullMQ (Bull.js) je knižnica Node.js používaná na implementáciu frontov v aplikáciách Node. Bull je systém založený na Redis (možno vám je viac známy Redis ako nástroj pre rýchle ukladanie dát) a je to rýchla a spoľahlivá možnosť, ktorú treba zvážiť pri zaraďovaní úloh do frontu v Node.js.
Bull môžete použiť na mnoho úloh, ako je implementácia oneskorených úloh, naplánovaných úloh, opakovateľných úloh, prioritných frontov a mnoho ďalších.
Ako teda môžete použiť Bull a Redis na asynchrónne spúšťanie úloh Node.js?
Ako nakonfigurovať Bull a Redis pre radenie úloh v Node.js
Ak chcete začať s radením úloh v Node.js s Bull, musíte mať na svojom počítači nainštalované Node.js a Redis. Môžete sledovať Sprievodca laboratóriami Redis na inštaláciu Redis ak ho nemáte nainštalovaný.
Prvým krokom k implementácii Bull je jeho pridanie do závislostí vášho projektu spustením npm nainštalovať bull alebo priadza pridať býk v termináli v priečinku vášho projektu. Existuje niekoľko spôsobov, ako inicializovať front v Bull, ako je uvedené nižšie:
konšt Front = vyžadovať("býk");
// rôzne spôsoby inicializácie frontu
// - pomocou redis URL reťazca
konšt emailQueue = Nový Front('E-mailový front', 'redis://127.0.0.1:6379');// - s pripojením redis a objektom volieb frontu
konšt videoQueue = Nový Front('Video front', 'redis://127.0.0.1:6379', queueOptions);// - bez pripojenia redis, ale s queueOption
konšt docQueue = Nový Front("Poradie dokumentov", queueOptions);
// - bez pripojenia redis alebo možností fronty
konšt QueueClient = Nový Front("Moje poradie");
Všetky tieto používajú minimálnu konfiguráciu pre Bull v Node.js. Objekt options podporuje mnoho vlastností a môžete sa o nich dozvedieť v sekcia možností frontu v dokumentácii Bull.
Implementácia e-mailového frontu úloh pomocou BullMQ
Ak chcete implementovať front na odosielanie e-mailov, môžete definovať funkciu výrobcu, ktorá pridáva e-maily do frontu e-mailov, a spotrebiteľskú funkciu na spracovanie odosielania e-mailov.
Po prvé, môžete inicializovať svoj front v triede pomocou adresy URL Redis a niektorých možností frontu, ako je uvedené nižšie.
// queueHandler.js
konšt Front = vyžadovať("býk");// tu použite skutočný modul obsluhy e-mailov - toto je len príklad
konšt emailHandler = vyžadovať('./emailHandler.js');// definuje konštanty, Redis URL a možnosti frontu
konšt REDIS_URL = 'redis://127.0.0.1:6379';konšt queueOpts = {
// možnosti obmedzovača rýchlosti, aby sa predišlo preťaženiu frontu
obmedzovač: {
// maximálny počet úloh, ktoré môže front prijať
max: 100,// čas čakania v milisekundách pred prijatím nových úloh potom
// dosiahnutie limitu
trvanie: 10000
},
predpona: „EMAIL-TASK“, // predpona, ktorá sa pridá ku všetkým kľúčom frontu
defaultJobOptions: { // predvolené možnosti pre úlohy vo fronte
pokusy: 3, // predvolený počet opakovaní úlohy// na odstránenie úlohy z frontu po dokončení
removeOnComplete: pravda
}
};triedaEmailQueue{
konštruktér() {
toto.fronta = Nový Front('E-mailový front', REDIS_URL, queueOpts);
}
};
exportpredvolená EmailQueue; // export triedy
Teraz, keď ste inicializovali front, môžete definovať svoju funkciu producenta (pomocou Bull's pridať () funkcia) ako metóda EmailQueue triedy na pridanie e-mailov do poradia úloh. Dokazuje to nasledujúci blok kódu:
// queueHandler.js
triedaEmailQueue{
konštruktér () {
// ...
}// funkcia producenta na pridanie e-mailov do frontu
async addEmailToQueue (emailData) {
// pridanie úlohy s názvom 'email_notification' do frontu
čakaťtoto.queue.add('email_notification', e-mailové údaje);
konzoly.log('e-mail bol pridaný do poradia...');
}
};
exportpredvolená EmailQueue; // export triedy
Funkcia producenta je pripravená a teraz môžete definovať spotrebiteľskú funkciu (pomocou Bull's proces() funkcia) na spracovanie všetkých e-mailových úloh vo fronte – t.j. zavolajte funkciu a odošlite e-mail. Túto spotrebiteľskú funkciu by ste mali definovať v konštruktore triedy.
// queueHandler.js
triedaEmailQueue{
konštruktér () {
// ...// spotrebiteľská funkcia, ktorá preberá priradený názov úlohy a
// funkcia spätného volania
toto.queue.process('email_notification', async (e-mailová úloha, hotovo) => {
konzoly.log('processing email notification task');
čakať emailHandler.sendEmail (emailJob); // odošlite e-mail
hotový(); // dokončite úlohu
})
}
// ...
};
exportpredvolená EmailQueue; // export triedy
Úloha môže mať aj možnosti na definovanie svojho správania vo fronte alebo na to, ako ho spracuje spotrebiteľská funkcia. Viac sa o tom môžete dozvedieť v časť o možnostiach práce v dokumentácii spoločnosti Bull.
The emailJob argument je objekt, ktorý obsahuje vlastnosti úlohy, ktorú má front spracovať. Obsahuje tiež hlavné údaje potrebné na zostavenie e-mailu. Pre ľahké pochopenie, poslať email() funkcia by bola podobná ako v tomto príklade:
// emailHandler.js
konšt sendgridMail = vyžadovať('@sendgrid/mail');konšt apiKey = process.env. SENDGRID_API_KEY
sendgridMail.setApiKey (apiKey); // nastavenie bezpečnostných poverení prenosu e-mailov
konšt poslaťEmail = async (e-mailJob) => {
skúste {
// extrahovať údaje e-mailu z úlohy
konšt { meno, email } = emailJob.data;konšt správa = {
od: '[email protected]',
komu: '[email protected]',
predmet: 'Ahoj! vitajte',
text: 'Dobrý deň ${name}, vitajte na MUO`
};čakať sendgridMail.sendMail (správa); // poslať email
// označenie úlohy ako dokončenej vo fronte
čakať emailJob.moveToCompleted('hotový', pravda);
konzoly.log('E-mail bol úspešne odoslaný...');
} chytiť (chyba) {
// presunie úlohu do neúspešných úloh
čakať emailJob.moveToFailed({ správu: 'spracovanie úlohy zlyhalo..' });
konzoly.chyba (chyba); // zapíšte chybu
}
}
exportpredvolená poslať email;
Teraz, keď máte funkcie výrobcu aj spotrebiteľa definované a pripravené na použitie, môžete zavolať funkciu výrobcu kdekoľvek vo svojej aplikácii a pridať e-mail do fronty na spracovanie.
Príklad ovládača by vyzeral takto:
// userController.js
konšt EmailQueue = vyžadovať('../handlers/queueHandler.js')konšt prihlásiť sa = async (req, res) => {
konšt { meno, email, heslo } = req.body;// --
// dotaz na pridanie nového užívateľa do databázy...
// --// pridať do frontu e-mailov
konšt emailData = { meno, email };
čakať EmailQueue.addEmailToQueue (emailData);
res.status(200).json({
správa: "Registrácia bola úspešná, prosím skontrolujte svoj e-mail"
})
}
Váš queueHandler.js súbor by mal byť teraz nasledovný:
// queueHandler.js
konšt Front = vyžadovať("býk");
konšt emailHandler = vyžadovať('../handlers/emailHandler.js');konšt REDIS_URL = 'redis://127.0.0.1:6379';
konšt queueOpts = {
obmedzovač: {
max: 100,
trvanie: 10000
},predpona: „EMAIL-TASK“,
defaultJobOptions: {
pokusy: 3,
removeOnComplete: pravda
}
};triedaEmailQueue{
konštruktér() {
toto.fronta = Nový Front('E-mailový front', REDIS_URL, queueOpts);// spotrebiteľ
toto.queue.process('email_notification', async (e-mailová úloha, hotovo) => {
konzoly.log('processing email notification task');
čakať emailHandler.sendEmail (emailJob);
hotový();
})
}// výrobca
async addEmailToQueue (emailData) {
// pridanie úlohy s názvom 'email_notification' do frontu
čakaťtoto.queue.add('email_notification', e-mailové údaje);
konzoly.log('e-mail bol pridaný do poradia...');
}
};
exportpredvolená EmailQueue;
Keď to implementujete v Node.js REST API, všimnete si skrátenie času odozvy koncového bodu registrácie a rýchlejšie časy doručenia e-mailov v porovnaní s alternatívou.
Fronty úloh vám tiež umožnili nezávisle spracovávať chyby pri registrácii a e-mailoch.
Optimalizácia aplikácií pomocou frontov úloh
Fronty správ a úloh sú skvelým spôsobom, ako zlepšiť všeobecný výkon aplikácií. Sú tiež veľmi lacné a môžete ich použiť v toľkých častiach aplikácie, koľko potrebujete.
Hoci tento tutoriál používal e-maily ako príklad scenára na spracovanie úloh náročných na pamäť s frontami, existuje mnoho ďalších prípadov, keď môžete použiť rovnaké koncepty. Patria sem náročné operácie čítania/zápisu, vykresľovanie vysokokvalitných obrázkov alebo dokumentov a odosielanie hromadných upozornení.