Čitatelia ako vy pomáhajú podporovať MUO. Keď uskutočníte nákup pomocou odkazov na našej stránke, môžeme získať pridruženú províziu. Čítaj viac.

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.

instagram viewer

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í.